当您运行Fib(7)时,对Fib(2)进行了多少次调用?
算法的定义如下:
Algorithm Fib(n):
if n = 0 or n = 1
then f = n
else f = Fib(n-1) + Fib(n - 2)
endif
return f
我认为答案是7。
答案 0 :(得分:2)
这是Python中伪代码的实现(几乎是复制粘贴):
def Fib(n):
if n == 0 or n == 1:
f = n
else:
f = Fib(n-1) + Fib(n - 2)
return f
print Fib(7)
现在,我添加以下几行:
if n == 2:
print 'Fib(2)'
结果是:
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
Fib(2)
13
这意味着Fib(2)
被称为 8次。
答案 1 :(得分:2)
设f(n)是计算Fib(n)时对Fib(2)的调用次数。
然后,f(2)= 1,f(3)= 1,并且对于k> 1。 3,f(k)= f(k-1)+ f(k-2)。
这与Fib本身具有相同的递归关系,你得到解f(k)= Fib(k-1)。对于特定情况k = 7,您得到解Fib(6)= 8。
这说明:计算Fib(n)时对Fib(m)的调用次数为Fib(n-m + 1)(假设n> = m)。
答案 2 :(得分:1)
为了它的乐趣,在Python中:
def fib(n):
def fib2(n):
count[n] = count.get(n,0)+1
if n < 2:
return n
else:
return fib2(n-1) + fib2(n-2)
count = {}
return fib2(n), [(c, count[c]) for c in sorted(count)]
print(fib(7))
打印
=> (13, [(0, 8), (1, 13), (2, 8), (3, 5), (4, 3), (5, 2), (6, 1), (7, 1)])
=== ======
所以fib(7)的结果是 13 ,而fib(2)被称为 8 次。