這個問題已經被問了很多,但是在瀏覽了帖子并按照答案所說的內容之后,我不明白為什么我的代碼仍然無法正常作業
所有關于遞回的帖子都說您需要包含一個 return 陳述句來實際回傳值,而不是 None。但是當我這樣做時,我會得到一個無限遞回。我有我的基本案例,以及 collat??z 序列的其他 2 個案例。我希望它列印出數字,但這是一個無限遞回。
#Maximum recursion
def find_collatz_nums(number):
if number == 1:
return find_collatz_nums(number)
if number % 2 == 0:
return find_collatz_nums(number/2)
return find_collatz_nums((3 * number) 1)
print(find_collatz_nums(3))
因此,如果我只是嘗試在基本情況下進行空白回傳,它將只回傳無。這是下面。
#returns None
def find_collatz_nums(number):
if number == 1:
return #will just return None.
if number % 2 == 0:
return find_collatz_nums(number/2)
return find_collatz_nums((3 * number) 1)
print(find_collatz_nums(3))
為什么在第一個代碼片段中,return 陳述句會導致無限遞回?
我只是發現自己很困惑,因為這里有大量關于遞回的帖子和回答說“你需要回傳陳述句”,但我已經添加了它們并且代碼不起作用。
uj5u.com熱心網友回復:
如果您遵循您的 porgram 邏輯,這是函式呼叫的序列:
find_collatz_nums (3) ->
find_collatz_nums (10) ->
find_collatz_nums (5) ->
find_collatz_nums (16) ->
find_collatz_nums (8) ->
find_collatz_nums (4) ->
find_collatz_nums (2) ->
find_collatz_nums (1) -> find_collatz_nums (1) -> find_collatz_nums (1).... & so on
因此,您會看到 python 無法停止此呼叫,并且會一次又一次地呼叫它。這就是為什么你需要一個基本條件才能從中回傳。
我猜你想列印出序列,你可以print在每個之前return
def find_collatz_nums(number):
if number == 1:
print(int(number))
return
if number % 2 == 0:
print(int(number), end="->")
return find_collatz_nums(number/2)
print(int(number), end="->")
return find_collatz_nums((3 * number) 1)
find_collatz_nums(3)
# 3->10->5->16->8->4->2->1
uj5u.com熱心網友回復:
第一個代碼片段會導致您陷入無限回圈,因為沒有條件來逃避遞回,即列印或顯式回傳任何內容。
uj5u.com熱心網友回復:
您的所有分支都是遞回的——即它們都再次呼叫該函式。因此,您實際上沒有基本案例。基本情況是您實際上可以直接計算或回傳值的情況,而不是遞回計算。
考慮另一個可以用遞回解決的問題:求串列中數字的總和:
基本情況是當您有空串列并且由于沒有值,所以總和僅為 0。
要考慮遞回情況,您可以對串列進行切片:第一項是單個數字,串列的其余部分只是另一個串列。這種情況的總和是第一項加上串列其余部分的總和:
>>> def find_sum(values):
... if len(values) == 0:
... return 0
... else:
... return values[0] find_sum(values[1:])
...
>>> find_sum([1, 2, 3])
6
>>>
我不知道 Collat??z 序列是什么,所以我將把它留給其他人來評論遞回應該如何尋找它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/486351.html
下一篇:Prolog-除法
