2017-03-22 81 views
0

遞歸函數如何返回printCountRec(dist-1)+ printCountRec(dist-2);在以下代碼中工作。通過我的邏輯printCountRec(dist-1)函數調用將返回1和printCountRec(dist-2)將通過添加這兩個返回0,答案應該是1 + 0即1,但我得到的答案爲3我不是在做了。如何添加2個遞歸函數

程序計數覆蓋距離的方法數量; 代碼如下 -

#include <iostream> 
using namespace std; 


int printCountRec(int dist) 
{ 
    // Base cases 
    if (dist<0) return 0; 
    else if (dist==0) return 1; 

    // Recur for all previous 3 and add the results 
    else return printCountRec(dist-1) + printCountRec(dist-2); 

} 

int main() 
{ 
    int dist = 3; 
    cout << printCountRec(dist); 
    return 0; 
} 
+0

你爲什麼用C標記這個?這不是有效的C代碼。你應該學會使用一個調試器,並通過你的代碼來了解它在做什麼 – UnholySheep

+0

聽起來像你應該使用調試器來遍歷代碼。這將顯示你完全鋤頭的程序流。 – NathanOliver

回答

2

這是我怎樣,我按照你的遞歸:

printCountRec(-1) = 0 
printCountRec(0) = 1 
printCountRec(1) = printCountRec(0) + printCountRec(-1) = 1 
printCountRec(2) = printCountRec(1) + printCountRec(0) = 2 
printCountRec(3) = printCountRec(2) + printCountRec(1) = 3 
0

的printCountRec(DIST-1)函數調用將返回1和printCountRec(dist- 2)將返回0

你是怎麼想的?一步一步:

  • printCountRec(dist-1)裝置printCountRec(2),這將調用printCountRec(1) + printCountRec(0)。對於這兩個,第一個將調用printCountRec(0) + printCountRec(-1),它將返回1+0 = 1到printCountRec(2),第二個將返回1到printCountRec(2)。

    換句話說,你有這樣的順序:

    printCountRec(dist-1) = printCountRec(2) --> 
    printCountRec(1) + printCountRec(0) --> 
    printCountRec(0) + printCountRec(-1) + 1 --> 
    1 + 0 + 1 --> 3 
    

    所以加的第一個成員進行評估,以2

  • printCountRec(dist-2)意味着printCountRec(1),它將調用printCountRec(0) + printCountRec(-1),返回1+0 = 1printCountRec(1)

    換句話說,你有這樣的順序:

    printCountRec(dist-2) = printCountRec(1) --> 
    printCountRec(0) + printCountRec(-1) --> 
    1 + 0 --> 1 
    

    所以加的第二部件進行評估,以1

添加兩個成員(21)給你的結果3

0

DIST = -1輸出0

DIST = 0輸出1

DIST = 1個輸出1

DIST = 2個輸出2

DIST = 3個輸出3

printCountRec(2)= printCountRec(1)+ printCountRec(0)= 2

printCountRec(3)= printCountRec(2)+ printCountRec(1)= 2 + 1 = 3。