2013-06-30 52 views
0

我剛剛發現約遞歸函數大概幾分鐘前回來。我玩弄他們,現在我從以下功能中獲得不同的輸出:遞歸函數的不同輸出

int function(int m) { 
    m = 2*m; 
    std::cout<<"In f m = "<<m<<std::endl; 
    if(m > 20) 
    { 
     return m; 
    } 
    function(m); 
}; 

int function2(int n) { 
    n = 2*n; 
    std::cout<<"In f2 n = "<<n<<std::endl; 
    if(n < 20) 
    { 
     function2(n); 
    } 
    return n; 
}; 

int main() { 
    int a = 2; 
    std::cout <<"function(a) = "<<function(a)<<std::endl; 
    std::cout <<"function2(a) = "<<function2(a); 
    return 1; 
} 

爲了這一點,我得到的輸出:

在FM = 4
在FM = 8
在FM = 16
在FM = 32
功能(A)= 32
在F2中n = 4的
在F2中N = 8
在F2中N = 16
在F2中N = 32
函數2的(a)= 4

應該不是它們都產率的結果32

+1

您的第一個函數實際上是表現出不確定的行爲,因爲如果基本情況不觸發它沒有返回值。 –

+0

@CharlesSalvia你在這裏用'base case'表示你的意思是什麼? –

回答

3

因爲你只做return n並且不從遞歸調用中分配它,所以第一次調用總是爲4

您應該例如

if(n < 20) 
    n = function2(n); 
return n; 
+0

修好了!不知道爲什麼我沒有注意到這一點。 –

+0

我應該注意到,n對每個函數調用都是本地的。 –

0

其實在功能2,n是否小於或大於20與否,聲明return n將 總是因爲如果當你在函數2傳遞參數α= 2語句不會return.so執行,它將返回4.如果你想讓他們都返回相同的結果。 ü可以修改函數2像

if(n < 20) 
{ 
    function2(n); 
} 
else 
    return n;