递归函数?[初学者]

Recursive function? [beginner]

本文关键字:初学者 递归函数      更新时间:2023-10-16

我不明白递归函数。

写了这段代码来帮助我,但我不明白为什么它以这种方式工作。

它向后打印从 0 到数字 n/2 i 输入的步骤,但不知道是什么让它打印从低到高跳过的每一步,因为它是递归的。我离得很近,但还没有到达那里...

#include <iostream>
#include <conio.h>
using namespace std;
int recursiv(int );
int times;
int main(){    
    int x;    
    cout<<"Imput numbern";
    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<< " stepsn";
    return 0;
}

当你处理递归时,你必须理解函数代码的两个主要部分:一个在前进的过程中执行,一个在返回的路上执行:

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的数字(到第一个,就像我们的示例一样。

如果我

正确理解你的问题:

它应该从高到低打印

,但它实际上是从低到高打印。这是为什么呢?

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;
}

不相关:全局变量被视为不良做法。它们有用例,这不是其中之一。我在函数中修复了这个问题。