まず、基本ケースを見つけますcall(n), when n<=0
。何もせず、単に戻ります。
定義の一般的なケースではcode(n)
、「デクリメントn
と再帰 (ずっと下まで)。コントロールが戻ると、出力n
(その値は保持されます) し、再度デクリメントして再帰します」。
または、方程式を使用します。
call(n) | when(n<=0) = NO-OP
call(n) | otherwise = call(n-1), print(n-1), call(n-2)
そう、
call(1) = call(0), print(0), call(-1)
= print(0)
call(2) = call(1), print(1), call(0)
= print(0), print(1)
call(3) = call(2), print(2), call(1)
= (print(0), print(1)), print(2), print(0)
続けて、
call(4) = 0120+3+01
call(5) = 0120301+4+0120
call(6) = 012030140120+5+0120301
....
最新の 2 つの値だけを維持しながら、結果として得られる出力の不定のシーケンスを生成できるようです。
(n,a,b) --> (n+1,b,b+n+a)
したがって、ベースケースに向かって下に再帰する代わりに、これは開始ケースから離れたコアカージョン(2,0,1)
を記述します(1
ケースは特別な事実によってカバーされ(1,_,0)
ます)。実際の無限に成長する (つまり「無限」 ) シーケンスとしてコーディングすることも、それから無限ループを作成することもできます。
そのような非終了計算の目的は何でしょうか? 結果の計算を説明するには、一般的に. しかしもちろん、 の目標値に到達すると、そのような計算を簡単に省略できますn
。
利益?再帰の代わりに、反復ループが得られます!
output(1) = "0"
output(n) | when(n>1) =
let {i = 2, a="0", b="1"}
while( i<n ):
i,a,b = (i+1),b,(b+"i"+a)
return b