簡體   English   中英

為什么這段代碼會讓我回復6561?

[英]Why does this code return me 6561?

我正在通過參考和函數調用學習函數調用,並且我在發現為什么它會讓我回到6561時遇到問題。

在我的main函數中,我調用了函數f(p,p) ,其中p在調用之前被初始化為5。

我將函數f定義為:

int f(int &x, int c)
{
    c = c - 1;
    if (c == 0)
        return 1;
    x = x + 1;
    return f(x,c)*x;
}

為什么這段代碼會返回6561

這個函數是一個相當復雜的函數來學習引用,因為要理解作為引用傳遞的第一個參數的含義,首先需要了解遞歸的本質。

讓我重復你的代碼:

int f(int &x, int c)
{
    c = c - 1;
    if (c == 0)
        return 1;
    x = x + 1;
    return f(x,c)*x;
}

顯然在某個地方還有另一個包含這樣的代碼的函數:

int p = 5;
result = f(p, p);

首先要注意的是它以遞歸方式調用自身。 參數c用作計數器以限制遞歸調用的數量。 它在f()的第一行遞減,當遞減到0 ,遞歸停止(通過返回1 )。

由於p初始化為5,遞歸將在5次調用后終止。

f()的第4行,參數x遞增。

最后在最后一行中,遞歸調用傳遞x的引用和遞減的c。

顯然函數返回6561作為結果,即9 * 9 * 9 * 9(相當於9 * 9 * 9 * 9 * 1)。 這是對這里發生的事情的暗示。

讓我們通過遞歸來跟蹤數據:

#0:條目:x = 5,c = 5,就在最后一行之前:x = 6,x = 4
#1:條目:x = 6,c = 4,就在最后一行之前:x = 7,x = 3
#2:條目:x = 7,c = 3,就在最后一行之前:x = 8,x = 2
#3:entry:x = 8,c = 2,就在最后一行之前:x = 9,x = 1
#4:entry:x = 9,c = 1,就在第3行之前:x = 9,x = 0(在第3行返回,返回1;)

return 1不再進行遞歸調用。 現在我們通過遞歸向后返回:

#3:x = 9 =>返回1 * 9; (評估為9)
#2:x = 9 =>返回9 * 9; (評估為81)
#1:x = 9 =>返回81 * 9; (評估為729)
#0:x = 9 =>返回729 * 9; (評估為6561)

現在為什么在所有四個遞歸級別中x = 9? 因為它是作為引用傳遞的,而不是值。 這意味着對於f()所有遞歸調用,x在內存中基本上是相同的變量(實際上所有x都是p的別名)。 在從第一個遞歸級別返回之前不僅x = 9,在f()返回之后p將是9。

雖然您為兩個參數傳遞p,但x在所有遞歸級別上都相同,而x不是(通過值傳遞)。 這應該解釋不同之處。

如果您還不了解,請閱讀有關參考文獻的內容。 如上所述,這個函數對於學習引用來說是一個相當復雜的函數,它似乎並不是非常有用。

暫無
暫無

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

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