【问题标题】:Implement recursion using one recursive call使用一次递归调用实现递归
【发布时间】:2015-08-14 10:49:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您的尝试方向正确,但需要稍作改变:

    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)
    

    【讨论】:

    • 它只给出 1 作为输出..:/.原因是 1 总是那么任何 n 所以它总是显示 1
    • @python_slayer 哎呀。检查编辑。现在还好吗?
    【解决方案2】:

    C# 中的 answer 可能会提示您如何做您想做的事。

    在 Python 中一次递归调用的斐波那契如下:

    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)
    

    【讨论】:

    • 我做了类似的事情,但得到 14 为 n=5 。这是我的代码:ideone.com/8zk4kI
    • 我不想要斐波那契数。请看问题:/
    • 哦,对不起,我误会了。
    【解决方案3】:

    乍一看,这看起来像是一个dynamic programming 问题。我真的很喜欢 memoization 来解决这样的问题,因为它使代码保持美观和可读性,但也提供了非常好的性能。使用 python3.2+ 你可以做这样的事情(你可以用旧的 python 版本做同样的事情,但你需要实现自己的 lru_cache 或安装许多具有类似工具的第三方之一):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2012-08-29
      • 2019-10-18
      • 2011-09-16
      • 1970-01-01
      • 2014-09-10
      • 2019-10-29
      相关资源
      最近更新 更多