簡體   English   中英

這個遞歸函數如何跟蹤它已經執行了多少次?

[英]How does this recursive function keep track of how many times it has been executed?

Project Euler 問題 14 給出以下問題:

為正整數集合定義了以下迭代序列:

n → n/2(n 是偶數)
n → 3n + 1(n 是奇數)

使用上面的規則並從 13 開始,我們生成以下序列:

13→40→20→10→5→16→8→4→2→1

可以看出,這個序列(從 13 開始到 1 結束)包含 10 項。 雖然還沒有被證明(Collat​​z 問題),但認為所有的起始數字都以 1 結束。

100 萬以下的哪個起始數字產生最長的鏈?

我找到了這個遞歸函數,它計算給定數字的 Collat​​z 鏈的長度。 數學邏輯非常簡單,易於理解。 但是,我不明白該函數如何跟蹤鏈的長度。

代碼如下:

def find_collatz_chain_length(x):
    if x == 1:
        print('here')
        return 1
    if x % 2 == 0:
        y = x // 2
        print(y)
    else:
        y = x * 3 + 1
        print(y)
    return find_collatz_chain_length(y) + 1

我添加了打印語句以在執行時遵循邏輯。 例如:

print(find_collatz_chain_length(13))

然后我得到以下輸出:

40 
20
10
5
16
8
4
2
1
here
10

這對我來說是有意義的,直到它返回鏈的長度(10)。 我知道這與最終 return 語句中的+1 ,因為改變它會導致錯誤的長度。 如果有人可以向我解釋該函數如何在沒有列表或計數器的情況下跟蹤長度,那就太好了。

讓我們用它的返回值替換函數調用。 我們從

find_collatz_chain_length(13)

那會回來

find_collatz_chain_length(40) + 1

查看函數調用,它將返回find_collatz_chain_length(20) + 1 ,但從第一次調用函數時我們已經有了+ 1

(find_collatz_chain_length(20) + 1) + 1

函數調用返回find_collatz_chain_length(10) + 1

(((find_collatz_chain_length(10) + 1) + 1) + 1)

每次調用該函數時,它都會添加一個+ 1 ,直到該函數的輸入為1 ,此時它停止調用自身並返回 1。您最終會得到類似的結果

(((((1) + 1) + 1) + 1) ... + 1)

與一個1每次調用函數。 把它們加起來,你就得到了你的鏈長。

暫無
暫無

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

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