递归函数理解

时间:2015-09-06 13:27:29

标签: c++ recursion

我一直在做运动的递归功能,而且有一部分让我很困惑。以下是整个代码的样子:

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参数有什么关系吗? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

真正的问题是在函数中一起使用document.forms.search.qpok+1。 那是在打印max-1的第一次迭代之后,情况是: 关于递增的252变为pok[63,4,126,252]变为max。 现在4再次提供pok[max-1]。 因此,如果您希望打印所有数组元素,请将函数调用4中的pok+1替换为RekFunkcija(pok + 1, max - 1);

答案 1 :(得分:3)

递归函数每回合缩小数组(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)

答案 2 :(得分:1)

RekFunkcija(pok + 1, max - 1);

你在这个递归调用中遇到了问题。每个调用最多减少1,这使你打印max - (number of recursive calls)元素,但是你也在向前移动1个元素,所以你从头开始打印第5个元素,然后从第2个位置打印第4个元素,等等。

替换为:RekFunkcija(pok, max - 1);

此外,我建议使用int main()代替void main,如here所述