我不理解递归函数。
我写了这段代码来帮助我,但我不明白为什么它会像它一样工作。
它向后打印从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;
}
答案 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
)获取,这是在递归到第一个之前的最后一次调用,就像我们的例子一样。