2.3 再帰的関数
問 2.2
factorial 関数が正しく動作することを, factorial 0, factorial 2, factorial 3 の各場合の動作をトレースすることによって確かめよ.
解答例 factorial 3の呼び出しは以下のようなトレースを生成する.
factorial 3 > 3 * factorial 2 > > 2 * factorial 1 > > > 1 * factorial 0 > > > > 1 > > > 1 * 1 > > > 1 > > 2 * 1 > > 2 > 3 * 2 > 6
問 2.3
以下の各数列について,が満たすべき性質をに関する漸化式として記述し, それに対応する再帰的関数を記述することによって,を求めるプログラムを 書け.
-
1.
-
2.
解答例
-
1.
漸化式は
と与えられる.よって,この関数をfとすると,以下の コードで実現できる.
fun f 0 = 0 | f n = n + f (n - 1);
-
2.
漸化式は、上記の漸化式の解をとして、
と与えられる.よって,この関数をgとすると,以下のコードで実現できる.
fun g 0 = 0 | g n = g (n - 1) + f n;
問 2.4
問2.3で定義した2つの関数が,それぞれ正しく数列の和 を計算することを,入力に関する帰納法で証明せよ.
解答例
-
1.
-
(a)
(基底)n = 0のとき., で正しい.
-
(b)
(帰納段階)n = kのとき正しいと仮定する.
である. 一方f (k + 1) = (k + 1) + f kであり,帰納法の仮定より であるから, である.
-
(a)
-
2.
-
(a)
(基底)のとき, , で正しい.
-
(b)
(帰納段階)のとき正しいと仮定する.
である. 一方であり, 帰納法の仮定と前項の結果より かつ であるから, である.
-
(a)
問 2.5
以下のように再帰的に定義される数列をフィボナッチ数列と呼ぶ.
負でない整数を受け取りを計算する関数 fib を定義せよ.
解答例
fun fib n = if n = 0 then 0 else if n = 1 then 1 else fib (n - 1) + fib (n - 2)
問 2.6
を与えられた負でない整数とし,任意のについて fib n がを計算することを,に関する数学的帰納法で示せ. これを用いて,fib が,0以上の任意の自然数に対して正しく の値を計算することを確認せよ.
解答例 任意のについてfib n がを計算することのに関する帰納法による証明
-
•
の時. かつ であり成立.
-
•
の時成立すると仮定する. である. 帰納法の仮定より, かつ である. また定義より, である. よって,となる. 従って,任意の について であり,成立する.
以上より,以上の任意のに対して, 任意の について であるから, 以上の任意の自然数に対して正しく の値を計算する.
問 2.7
フィボナッチ数列の再帰的定義をそのまま再帰的関数として実現す ると,の計算に掛かる時間はが大きくなるに従って指数関数的に増大す る. をに比例する時間で計算する関数 fastFib を以下の洞察を 参考に定義せよ.
-
1.
フィボナッチ数列の定義は,連続する2つの数から次の数を決めるような 構成になっている. したがって,とが与えられればが即座に求められ る. この作業を回繰り返せば,とからが求めら れるはずである.
-
2.
前項の考え方を参考に,与えられた連続する2つのフィボナッチ数 とから, の個先のフィボナッチ数を求める関数 G(,,) を定義する. がの場合はを返せばよい. がの場合はを返せばよい. が以上の場合は,とからを求め, とから,の個先のフィボナッチ数を求めればよ いから,G(,,) を呼び出せばよい.
-
3.
はから個先のフィボナッチ数であるから,G(n,,) である. したがって fastFib は,上記の動作をする補助関数 G を呼 び出すことによって実現できる.
解答例
fun G(n,fk,fk1) = if n = 0 then fk else if n = 1 then fk1 else G(n-1,fk1,fk+fk1); fun fastFib n = G(n,0,1);
問 2.8
負でない任意の整数に対してG(,,)は を計算することを,に関する数学的帰納法で証明せよ. この性質を使って,fastFib が正しくフィボナッチ数を計 算することを示せ.
解答例
-
•
の時。
G(0,,) G(1,,) であり成立する.
-
•
の時。 Gの定義より
である. の定義より, である. よって, である. 帰納法の仮定より, となり成立する.
以上の特殊な場合として, であり,したがって, である.