递归函数? [初学者]

时间:2013-03-26 14:23:17

标签: c++ function recursion global

我不理解递归函数。

我写了这段代码来帮助我,但我不明白为什么它会像它一样工作。

它向后打印从0到n / 2 i输入的步数但不知道是什么使它从低到高跳过每一步,因为它是递归的。我很亲密,但还没有......

#include <iostream>
#include <conio.h>
using namespace std;

int recursiv(int );

int times;

int main(){    
    int x;    
    cout<<"Imput number\n";
    cin>>x;    
    recursiv(x);

    getch();
  return 0;
}
int recursiv(int x){

    times++;
    if(x)
    recursiv(x/2);
    cout<<"We are now at "<<x/2<<endl;
    if (!x)
    cout<< "We reached "<<x<<" but it took "<<times-1<< " steps\n";
    return 0;
}

2 个答案:

答案 0 :(得分:4)

如果我理解你的问题:

它应该从高到低打印,但它实际上从低到高打印。那是为什么?

cout<<"We are now at "<<x/2<<endl;行是在递归调用之后。 因此,该函数会一次又一次地调用自身,直到达到中断标准。 具有最小金额的函数调用std::cout,返回第二个最小金额的函数std::cout,依此类推,直到最后一个函数为止。

如果您希望结果按其他顺序排列,请将提到的行移动两行,这样每次迭代都会在调用子项之前回显。

示例:

int recursiv(int x, int times = 0) {
  std::cout << "We are now at " << x/2 << std::endl;

  if(x)
    return recursiv(x/2, times + 1);
  else
    std::cout << "We reached " << x << " but it took " << times << " steps" << std::endl;

  return 0;
}

无关:全局变量被认为是一种不好的做法。它们有用例,这不是其中之一。我在函数中修复了它。

答案 1 :(得分:4)

当你处理递归时,你必须理解功能代码的两个主要部分:在前进的道路上执行的部分,以及在回来的路上执行的部分:

void X() {
    // way forward
    X();
    // way back
}

前进部分在反复调用函数时执行,直到递归结束;从最后一次调用返回时,执行返回

void print(int x) {
    if (!x) return; // end of recursion
    std::cout << x << " ";
    print(x-1);
}

以上示例在前进道路上包含std::cout << x,这意味着调用print(5)将打印:5 4 3 2 1

void print(int x) {
    if (!x) return; // end of recursion
    print(x-1);
    std::cout << x << " ";
}

以上示例将实际打印移至功能的返回部分,这意味着将打印同一个呼叫print(5)1 2 3 4 5

让我们采取你的功能(清理一下):

int recursiv(int x){
    times++;
    if(!x) return 0; // split
    recursiv(x/2);
    cout << "We are now at "<< x / 2 << endl;
    return 0;
}

我们可以很容易地区分我们的两个部分。 前进道路是:

times++;
if(x) return;

我们只是递增我们的int参数times(我们只是忽略递归结束的条件)。

返回的方式是:

cout<<"We are now at "<<x/2<<endl;
return 0;

将从最后一次调用到第一次调用执行(就像示例的第二个版本一样)。因此,从最小的数字(由于结束递归条件更接近0)获取,这是在递归到第一个之前的最后一次调用,就像我们的例子一样。