使用一个递归调用实现递归

时间:2015-06-01 04:31:54

标签: python python-2.7 python-3.x recursion

给定如下函数: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

3 个答案:

答案 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