Hex Artifact Content
Not logged in

Artifact 4438bc82733dcb164a3d01caf3d1a679574a8395:


0000: 23 20 53 74 61 6e 64 61 72 64 20 46 69 62 6f 6e  # Standard Fibon
0010: 61 63 63 69 20 66 75 6e 63 74 69 6f 6e 0a 64 65  acci function.de
0020: 66 20 66 69 62 28 78 29 0a 7b 0a 09 69 66 20 78  f fib(x).{..if x
0030: 3c 32 20 74 68 65 6e 20 31 20 65 6c 73 65 20 66  <2 then 1 else f
0040: 69 62 28 78 2d 31 29 20 2b 20 66 69 62 28 78 2d  ib(x-1) + fib(x-
0050: 32 29 0a 7d 3b 0a 0a 6c 65 74 20 75 70 74 6f 20  2).};..let upto 
0060: 3d 20 66 75 6e 28 6e 2c 20 66 29 7b 0a 09 69 66  = fun(n, f){..if
0070: 20 6e 20 3e 20 30 3a 20 75 70 74 6f 28 6e 2d 31   n > 0: upto(n-1
0080: 2c 66 29 3b 0a 09 66 28 6e 29 0a 7d 3b 0a 0a 76  ,f);..f(n).};..v
0090: 61 72 20 63 6f 6d 70 6f 73 65 20 3d 20 66 75 6e  ar compose = fun
00a0: 28 66 2c 67 29 7b 20 66 75 6e 28 78 29 7b 66 28  (f,g){ fun(x){f(
00b0: 67 28 78 29 29 7d 20 7d 3b 0a 76 61 72 20 22 3c  g(x))} };.var "<
00c0: 3c 22 20 3d 20 63 6f 6d 70 6f 73 65 3b 0a 0a 75  <" = compose;..u
00d0: 70 74 6f 28 31 38 2c 20 70 72 69 6e 74 3c 3c 66  pto(18, print<<f
00e0: 69 62 29 3b 0a 0a 0a 23 23 23 23 23 23 23 23 23  ib);...#########
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20  #############.# 
0110: 4f 6d 61 6b 65 2e 20 46 65 65 6c 20 74 68 65 20  Omake. Feel the 
0120: 61 75 74 6f 6d 61 74 69 63 20 6d 65 6d 6f 69 7a  automatic memoiz
0130: 61 74 69 6f 6e 21 0a 0a 23 20 53 65 74 20 75 70  ation!..# Set up
0140: 20 61 20 6d 69 72 72 6f 72 20 6c 61 79 65 72 20   a mirror layer 
0150: 28 64 6f 2d 74 68 65 2d 73 61 6d 65 2d 74 68 69  (do-the-same-thi
0160: 6e 67 20 6c 61 79 65 72 29 20 6f 66 20 40 76 61  ng layer) of @va
0170: 6c 75 65 0a 40 40 6d 28 78 29 7b 78 7d 3b 0a 40  lue.@@m(x){x};.@
0180: 6d 20 22 2b 22 20 28 78 2c 79 29 20 7b 20 40 76  m "+" (x,y) { @v
0190: 61 6c 75 65 28 40 6d 28 78 29 2b 40 6d 28 79 29  alue(@m(x)+@m(y)
01a0: 29 20 7d 3b 0a 40 6d 20 22 2d 22 20 28 78 2c 79  ) };.@m "-" (x,y
01b0: 29 20 7b 20 40 76 61 6c 75 65 28 40 6d 28 78 29  ) { @value(@m(x)
01c0: 2d 40 6d 28 79 29 29 20 7d 3b 0a 40 6d 20 22 3c  -@m(y)) };.@m "<
01d0: 22 20 28 78 2c 79 29 20 7b 20 40 76 61 6c 75 65  " (x,y) { @value
01e0: 28 40 6d 28 78 29 3c 40 6d 28 79 29 29 20 7d 3b  (@m(x)<@m(y)) };
01f0: 0a 40 6d 20 22 69 66 22 20 28 63 2c 74 2c 65 29  .@m "if" (c,t,e)
0200: 20 7b 20 40 76 61 6c 75 65 28 69 66 20 40 6d 28   { @value(if @m(
0210: 63 29 20 74 68 65 6e 20 40 6d 28 74 28 29 29 20  c) then @m(t()) 
0220: 65 6c 73 65 20 40 6d 28 65 28 29 29 29 20 7d 3b  else @m(e())) };
0230: 0a 0a 23 20 48 65 6c 70 65 72 20 66 75 6e 63 74  ..# Helper funct
0240: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 66 69 62 20  ion to call fib 
0250: 69 6e 20 6c 61 79 65 72 20 40 6d 0a 64 65 66 20  in layer @m.def 
0260: 66 69 62 6d 28 78 20 40 76 61 6c 75 65 29 20 7b  fibm(x @value) {
0270: 20 40 6d 28 66 69 62 28 40 76 61 6c 75 65 28 78   @m(fib(@value(x
0280: 29 29 29 20 7d 3b 0a 0a 23 20 55 73 65 72 20 64  ))) };..# User d
0290: 65 66 69 6e 65 64 20 6c 61 79 65 72 73 20 61 72  efined layers ar
02a0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
02b0: 6d 65 6d 6f 69 7a 65 64 2e 0a 23 20 53 6f 20 74  memoized..# So t
02c0: 68 69 73 20 69 73 20 6d 75 63 68 20 66 61 73 74  his is much fast
02d0: 65 72 2e 0a 75 70 74 6f 28 31 38 2c 20 70 72 69  er..upto(18, pri
02e0: 6e 74 3c 3c 66 69 62 6d 29 3b 0a                 nt<<fibm);.