2015-09-06 109 views
1

我一直在做一個練習的遞歸函數,還有一個讓我很困惑的部分。這裏就是整個代碼如下所示:瞭解遞歸函數

void RekFunkcija(int * pok, int max) 
{ 
    if (max != 0) 
    { 
     cout << pok[max - 1] << endl; 
     RekFunkcija(pok + 1, max - 1); 
    } 
} 

void main() 
{ 
    const int max = 5; 
    int niz[] = { max, 63, max, 126, 252 }; 
    RekFunkcija(niz, max); 
} 

所以這裏的輸出是:

enter image description here

什麼一直困惑我的是遞歸函數的這一部分:cout << pok[max - 1] << endl; 我不明白爲什麼它是否始終輸出數組的最後一個成員(252)?索引號(max-1)遞減1?不應該輸出:252,126,5,63,5?這與pok+1的論點有什麼關係? 預先感謝您。

+1

學+ 1學更換。 http://ideone.com/RjsQX3 –

回答

4

遞歸函數收縮(上pok + 1指針遞增)的陣列中的每個轉彎並校正max參數。這是僞代碼雜交會發生什麼:

  1. RekFunkcija([5, 63, 5, 126, 252], 5)
  2. RekFunkcija([63, 5, 126, 252], 4)
  3. RekFunkcija([5, 126, 252], 3)
  4. RekFunkcija([126, 252], 2)
  5. RekFunkcija([252], 1)
+0

所以它縮小了!我還沒有意識到這一點。你真的把我清除了,非常感謝你。 – Kapobajza

5

真正的問題是在功能中使用了pok+1max-1。 即在第一次迭代之後,當打印252時,情況是: pok在遞增時變爲[63,4,126,252]max變爲4。 現在pok[max-1]再次給出4。 所以,如果你想打印所有的數組元素的函數調用RekFunkcija(pok + 1, max - 1);更換pok+1RekFunkcija(pok, max - 1);

+0

謝謝。我認爲它必須用'pok + 1'的論點來做些事情,但是又一次:我真的很困惑。但現在,我很清楚。再次感謝。 – Kapobajza

1
RekFunkcija(pok + 1, max - 1); 

你必須在這個遞歸調用的一個問題。每次調用最多減1,這使得您可以打印max - (number of recursive calls)元素,但您也正在向前移動第1個元素,因此您要從頭開始打印第5個元素,然後從第2個開始打印第5個元素,依此類推。

替換:RekFunkcija(pok, max - 1);

此外,我建議使用int main()代替void main,作爲所述here

+0

謝謝你的回答,並感謝'int main()'的建議。 – Kapobajza