numeric u, d, f[]; u = 1cm; d = 0.1u; vardef rotation( expr dir ) = pair p; if (xpart(dir)=1) : p := (0,1); else: if (xpart(dir) = -1): p := (0,-1); else: if (ypart(dir) = 1): p := (-1,0); else: p := (1,0); fi; fi; fi; p enddef; def drawsquare( expr pos, size, dir, n, m ) = draw pos-- pos + size*dir-- pos + size*(dir + rotation( dir ))-- pos + size*(dir + rotation( dir ) + rotation( rotation( dir )))-- cycle; enddef; def fibonacci( expr n, m, pos, dir ) = numeric size; if (n <= m): if (n = 0): f0 := 1; else: if (n = 1): f1 := 1; else: f[n] := f[n-1] + f[n-2]; fi;fi; size := d * f[n]; drawsquare( pos, size, dir, n, m ); fibonacci( n+1, m, pos + size*(dir + rotation( dir ) ), rotation( dir ) ); fi; enddef; beginfig( 0 ); pickup pencircle scaled 3pt; fibonacci( 0, 11, (0,0), (0,-1) ); endfig; end.