给定如下函数:f(n)= f(n-1)+ f(n-3)+ f(n-4)
f(0) = 1
f(1) = 2
f(2) = 3
f(3) = 4
我知道使用一个函数内的三个递归调用递归来实现它。但我想在函数内只进行一次递归调用。怎么做?
这里使用3个递归调用来实现我的代码:
def recur(n):
if n == 0:
return 1
elif n == 1:
return 2
elif n == 2:
return 3
elif n == 3:
return 4
else:
return recur(n-1) + recur(n-3) + recur(n-4) #this breaks the rule because there are 3 calls to recur
答案 0 :(得分:2)
C#中的这个answer可能会给你提示如何做你想做的事情。
在Python中进行一次递归调用的Fibbonacci如下:
def main():
while True:
n = input("Enter number : ")
recur(0,1,1,int(n))
def recur(firstNum,secondNum,counter,n):
if counter==n :
print (firstNum)
return
elif counter < n
recur (secondNum,secondNum+firstNum,counter+1,n)
答案 1 :(得分:2)
你的尝试是正确的方向,但需要稍作改动:
def main():
while True:
n = input("Enter number : ")
recur(1,2,3,4,1,int(n))
def recur(firstNum,secondNum,thirdNum,fourthNum,counter,n):
if counter==n:
print (firstNum)
return
elif counter < n:
recur (secondNum,thirdNum,fourthNum,firstNum+secondNum+fourthNum,counter+1,n)
答案 2 :(得分:0)
乍一看,这看起来像dynamic programming问题。我非常喜欢memoization这样的问题,因为它使代码保持良好和可读性,同时也提供了非常好的性能。使用python3.2 +你可以做这样的事情(你可以用较旧的python版本做同样的事情,但你需要实现自己的lru_cache或安装许多具有类似工具的第三方之一):< / p>
import functools
@functools.lru_cache(128)
def recur(n):
print("computing recur for {}".format(n))
if n == 0:
return 1
elif n == 1:
return 2
elif n == 2:
return 3
elif n == 3:
return 4
else:
return recur(n-1) + recur(n-3) + recur(n-4)
请注意,该函数每n只调用一次:
recur(6)
# computing recur for 6
# computing recur for 5
# computing recur for 4
# computing recur for 3
# computing recur for 1
# computing recur for 0
# computing recur for 2