2014-07-06 24 views
-1

使用遞歸實現是否有意義?下面我寫了一些不好的解決方案 請指正在Python中使用遞歸的冰雹序列

def hailstone(n): 
    if(n<0): 
     print("Invalid input") 
     return None 
    if(n==1): 
     print(1) 
     return None 
    if(n%2 == 0): 
     print(n) 
     hailstone(n/2) 
    if(n%2==1): 
     print(n) 
     hailstone((n*3) + 1) 

我的問題:

如何移動n<0狀態到正確的地方?我是否錯過或添加額外的退貨聲明?

+0

0123錯誤':'你的第四個如果 – sshashank124

回答

0

你的解決方案並不是那麼糟糕,它是一個簡單的遞歸解決方案,它可以爲你提供小號n的冰雹序列。似乎有一個失蹤冒號指出bu sshashank124,你應該有n<=0而不是n<0

但是,遞歸函數通常不應該在函數本身內僅調用一次遞歸函數時使用。在這種情況下,遞歸本質上是一個循環。在你的情況等同的功能可以通過以下方式獲得:

def hailstone(n): 
    if(n<=0): 
     print("Invalid input") 
     return None 
    while n > 1: 
     if n % 2 == 1: 
      n = 3*n + 1 
     else: 
      n = n/2 
     print n 
    return None 

在任何情況下,我建議你發佈你的代碼的代碼審查網站:http://codereview.stackexchange.com

(至於你的問題,你可能有幾個return另一個 - 通常更好 - 可能是當你收到錯誤的輸入時產生錯誤)

如果你想計算大量的n的序列長度,那麼你的算法不一定表現最好的一個。

+0

使用'if not n%2'並且使用0的隱含「虛假性」而不是'if n%2 == 1 – IanAuld

+0

@ IanAuld:就我個人而言,儘管它是一個c'ism,但我只是使用'if n&1',因爲這是我讀得最快的構造...我儘量保持代碼儘可能接近OP的形式和樣式。但是,是的,我建議將代碼暴露給codereview的好人是有原因的。 – DrV

+0

@DVV我在代碼中看到了多個'return None'。在一個函數中,如果我沒有提到這個,python函數會隱式地不返回None嗎? – overexchange