[英]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.