東京大学 情報理工学系研究科 電子情報学専攻 2013年8月実施 専門 第3問
Author
祭音Myyura (co-authored with GPT 5.6 SOL)
Description
, および漸化式 で表される数列はフィボナッチ数列と呼ばれる。これについて以下の問いに答えよ。
(1) 漸化式に従い、再帰呼び出しを使って を計算するプログラムを擬似コードにより記述せよ。
(2) 漸化式に従い、再帰呼び出しを使わずに を計算するプログラムを擬似コードにより記述せよ。
(3) 64ビット整数を用いて計算する場合、(1) および (2) それぞれの方法の問題点を述べよ。
(4) フィボナッチ数列の一般項は
となることが分かっている。この式に従って浮動小数点数を用いて計算する場合、(2) の方法と比較し利害得失を述べよ。
题目描述
数列由 、 以及递推关系
定义,称为斐波那契数列。回答下列问题。
(1) 按照上述递推关系,写出使用递归调用计算 的伪代码。
(2) 再写一段依据同一递推关系、但不使用递归调用来计算 的伪代码。
(3) 假设使用 位整数,分别说明 (1)、(2) 两种方法的缺点。
(4) 斐波那契数列的闭式为
与 (2) 的方法相比,说明使用浮点数按该闭式计算的优点与缺点。
Kai
(1)
Fib(n):
if n <= 1:
return n
return Fib(n - 1) + Fib(n - 2)
(2)
Fib(n):
if n <= 1:
return n
a = 0
b = 1
for i = 2 to n:
c = a + b
a = b
b = c
return b
(3)
(1) は同じ値を繰り返し計算し、 とすると時間は 、再帰スタックの空間は となる。(2) は時間 、追加空間 だが、計算時間は に比例して増える。
両者とも64ビット整数の範囲を超えると正しい値を表せない。符号付き整数では
より、 でオーバーフローする。符号なし整数でも となる。
(4)
一般項では過去の全項を順に求める必要がなく、累乗を二乗法で計算すれば浮動小数点演算の回数は となる。また、通常の浮動小数点形式では64ビット整数より大きい値を近似的に扱える。
一方、 や累乗の丸め誤差が蓄積・増幅し、整数値が厳密に得られる保証はない。最寄りの整数に丸めても、誤差が 以上なら誤答となる。十分大きい では浮動小数点数もオーバーフローする。(2) は整数の表現範囲内なら厳密である。