function [] = boxfib(n) % boxfib(n): animated trace of fib(n) with $fib$ renamed to $f$ -- % user must type a key to advance from one movie frame to the next if nargin < 1 n = 3; end if n>3 warning('boxfib does not work well for n>3') end big.command = []; fib(n, big); function x = fib(p,big) code = strvcat(... 'if n < 2', ... ' x = n;', ... 'else', ... ' ', ... ' x = f(n-1) + f(n-2);', ... 'end'); code = [repmat(' ',6,4) code]; mename = fibname(p); me.act_ = 'draw activation record'; me.header_ = strvcat(' ', 'function x = f(n)'); me.code_ = []; big = setfield(big, mename, me); boxdisp(big); me.act_ = strvcat('draw parameter;', 'fill with argument'); me.n = p(1); big = setfield(big, mename, me); boxdisp(big); me.act_ = 'run function body'; me.code_ = code; me.code_ = code; me.code_(1,1:3) = '-->'; big = setfield(big, mename, me); boxdisp(big); if p(1)<2 me.code_ = code; me.code_(2,1:3) = '-->'; me.x = me.n; big = setfield(big, mename, me); boxdisp(big); else me.code_ = code; me.code_(3,1:3) = '-->'; big = setfield(big, mename, me); boxdisp(big); me.code_ = code; me.code_(4,1:3) = '-->'; me.code_(4, 11:16) = '?'; big = setfield(big, mename, me); boxdisp(big); left = fib([p(1)-1 p], big); sleft = num2str(left); me.code_(4, :) = ' '; me.code_(4,1:3) = '-->'; me.code_(4, 10+(1:length(sleft))) = sleft; me.code_(4, 20:25) = '?'; big = setfield(big, mename, me); boxdisp(big); right = fib([p(1)-2 p], big); sright = num2str(right); me.code_(4, :) = ' '; me.code_(4,1:3) = '-->'; me.code_(4, 10+(1:length(sleft))) = sleft; me.code_(4, 19+(1:length(sright))) = sright; big = setfield(big, mename, me); boxdisp(big); me.code_ = code; me.code_(5,1:3) = '-->'; me.code_(4, 10+(1:length(sleft))) = sleft; me.code_(4, 19+(1:length(sright))) = sright; me.x = left + right; big = setfield(big, mename, me); boxdisp(big); end x = me.x; me.code_ = code; me.code_(6,1:3) = '-->'; big = setfield(big, mename, me); boxdisp(big); me.code_ = []; me.act_ = strvcat('copy out return value;', 'kill activation record'); if length(p) > 1 codename = [fibname(p(2:end)) '.code_']; hicode = getfield(big, codename); s = num2str(x); where = 10; if p(2) - p(1) == 2, where = 19; end hicode(4,where+(1:6)) = ' '; hicode(4,where+(1:length(s))) = s; big = setfield(big, codename, hicode); end me = rmfield(me,'n'); big = setfield(big, mename, me); boxdisp(big); if length(p) == 1 big = rmfield(big, mename); big.command.ans = x; boxdisp(big); end function s = fibname(p) s = ['f' num2str(fliplr(p), '_%1d')]; function [] = boxdisp(big) s = boxscope(big,1); % pre-compute to avoid delay between $clc$ and $disp$ clc; disp(s); pause