描述
观察到 Fibonacci 数列满足
fib(n) = 1 * fib(n - 1) + 1 * fib(n - 2)
= 2 * fib(n - 2) + 1 * fib(n - 3)
= 3 * fib(n - 3) + 2 * fib(n - 4)
= 5 * fib(n - 4) + 3 * fib(n - 5)
= 8 * fib(n - 5) + 5 * fib(n - 6)
易得
fib(2*m) = fib(m) * fib(m) + fib(m - 1) * fib(m - 1),
fib(2*m + 1) = fib(m) * fib(m) + 2 * fib(m) * fib(m - 1),
基于上述结果作为递归公式,定义函数 fib 以递归的方式计算 fib数列的第n项,要求尽可能减少函数被调用次数(这里要求不能使用 list)。
程序再读入一个正整数 n,调用所定义的 fib 函数计算并输出 fib(n),同时输出 fib 函数被调用的次数。
输入
一行,一个正整数 n
输出
两行
第一行为 fib(n)
第二行为 fib() 函数被调用的次数
样例输入
5
样例输出
8
5
提示
这里要求不能使用 list!
已知fib(0)=fib(1)=1
样例计算方式为
fib(5)
=fib(2)*fib(2)+2*fib(2)*fib(1)
fib(2)
=fib(1)*fib(1)+fib(0)*fib(0)
要求尽可能减少递归过程中的调用函数次数
# endcoding : UTF-8
"""
@author = 寻找任大侠
@email = renjx@stu.pku.edu.cn
@create_time = 2021/11/13 15:06
"""
index = 0 #调用次数
def fib(n):
global index
index += 1 #每次调用++
if n == 1 or n == 0:
return 1
#根据递推公式写程序
f_1 = fib(n // 2)
f_2 = fib(n // 2 - 1)
if n % 2 == 0:
return f_1 * f_1 + f_2 * f_2
elif n % 2 == 1:
return f_1 * f_1 + 2 * f_1 * f_2
n = int(input())
print(fib(n))
print(index)