フィボナッチ
id:h_sakuraiさんからフィボナッチも書いてみて下さい(もちろん再帰で)と言われたので書いてみた。
1.1
#フィボナッチ再帰 def fib n case n when 0 then 0 when 1 then 1 else fib(n-1)+fib(n-2) end end puts fib 10 #=>55
これ、でかい引数渡したらスタックやばいよね
むー・・
def fib n def f(n,a=1,b=0) case n when 0 then 0 when 1 then a else f(n-1,a+b,a) end end f(n) end puts fib 10 #=>55
入れ子にしてみた。
n,a,b
10,1,0
9,1,1
8,2,1
7,3,2
6,5,3
5,8,5
4,13,8
3,21,13
2,34,21
1,55,34 => when 1 then a でaがかえって55
うーむ、再帰って、コードでの処理の流れと、頭の中で考えてる流れの不一致が難しく感じる原因かな?
階乗その2
def fact(n,r=n) if n==1 r else fact(n-1,r*(n-1)) end end puts fact 3 #=>6
//Scala.貘本より def factorial(i: Int): Int = { def fact(i: Int, accumulator: Int): Int = { if (i <= 1) accumulator else fact(i - 1, i * accumulator) } fact(i, 1) }