簡體   English   中英

使用一個遞歸調用實現遞歸

[英]Implement recursion using one recursive call

給定如下函數: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

C#中的這個答案可能會給你一個如何做你想做的事情的提示。

在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)

您的嘗試是正確的方向,但需要稍作改動:

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)

乍一看,這看起來像一個動態編程問題。 我真的很喜歡這樣的問題的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM