递归函数?[初学者]
Recursive function? [beginner]
我不明白递归函数。
我写了这段代码来帮助我,但我不明白为什么它以这种方式工作。
它向后打印从 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;
}
不相关:全局变量被视为不良做法。它们有用例,这不是其中之一。我在函数中修复了这个问题。
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 递归函数?[初学者]