C++ c+中的递归+;
两天后我参加了一次考试,我的教授给了我们一次有答案的旧考试,但是在无数次地复习这个问题之后,我不明白答案到底是怎么回事C++ c+中的递归+;,c++,recursion,C++,Recursion,两天后我参加了一次考试,我的教授给了我们一次有答案的旧考试,但是在无数次地复习这个问题之后,我不明白答案到底是怎么回事 int recursive (int n) { if (n < 10) return n; return 100 * recursive (n / 100) + 10 * (n % 10); } int main(){ cout << recursive (19683) << endl; return 0; } 那
int recursive (int n) {
if (n < 10) return n;
return 100 * recursive (n / 100) + 10 * (n % 10);
}
int main(){
cout << recursive (19683) << endl;
return 0;
}
那我会的
100*1+10*3 = 130
这是完全错误的,如果有人知道如何得到答案,我们将不胜感激。第一次调用(recursive(19683)
)返回:
100*递归(196)+10*3
第二个调用(recursive(196)
)返回:
100*递归(1)+10*6
第三个调用(recursive(1)
)直接返回1。换回来,你会得到:
100*(100*1+60)+30=10000+6000+30=16030
第一个调用(recursive(19683)
)返回:
100*递归(196)+10*3
第二个调用(recursive(196)
)返回:
100*递归(1)+10*6
第三个调用(recursive(1)
)直接返回1。换回来,你会得到:
100*(100*1+60)+30=10000+6000+30=16030
早在高中时,我们就被教导能够对代码进行桌面检查。桌面检查是你手工计算每一步结果的地方
int recursive (int n) {
if (n < 10) return n;
return 100 * recursive (n / 100) + 10 * (n % 10);
}
int递归(int n){
如果(n<10)返回n;
返回100*递归(n/100)+10*(n%10);
}
通过这个19683
递归(19683)
19683<10是假的
返回100*递归(196)+10*(19683%10->3)
递归(196) 196<10是错误的 返回100*递归(1)+10*(196%10->6)
递归(1) 1<10为真,返回1
将递归(1)=1替换为前面的等式 返回100*1*60->160 将递推(196)=160代入前面的等式中
return 100*160+10*3->16030回到高中,我们被教导能够桌面检查代码。桌面检查是你手工计算每一步结果的地方
int recursive (int n) {
if (n < 10) return n;
return 100 * recursive (n / 100) + 10 * (n % 10);
}
int递归(int n){
如果(n<10)返回n;
返回100*递归(n/100)+10*(n%10);
}
通过这个19683
递归(19683)
19683<10是假的
返回100*递归(196)+10*(19683%10->3)
递归(196) 196<10是错误的 返回100*递归(1)+10*(196%10->6)
递归(1) 1<10为真,返回1
将递归(1)=1替换为前面的等式 返回100*1*60->160 将递推(196)=160代入前面的等式中 返回100*160+10*3->16030递归(19683)=100*递归(196)+10*3 递归(196)=100*递归(1)+10*6 递归(1)=1 现在回填答案 递归(196)=100+60 递归(19683)=100*160+30=16030递归(19683)=100*递归(196)+10*3 递归(196)=100*递归(1)+10*6 递归(1)=1 现在回填答案 递归(196)=100+60
递归(19683)=100*160+30=16030要了解发生了什么,请看一个简单的递归示例,例如反转字符串。这个问题的答案很好地解释了递归的工作原理:-
一旦这对您有意义,您应该会发现理解您提出的示例问题要容易得多。为了理解发生了什么,请看一个更简单的递归示例,例如反转字符串。这个问题的答案很好地解释了递归的工作原理:-
一旦这对您有意义,您应该会发现理解您提出的示例问题要容易得多。您是否尝试过使用调试器逐步解决它?或者在递归中添加打印语句?为什么输出应该是16030?你的算法试图实现什么?你能提供更多的例子并为你的问题添加更多的细节吗?提示:第一次迭代不是
100*196+10*3
,而是100*递归(196)+10*3
。@srikfreak-“为什么输出应该是16030?”因为教授说输出应该是这样的!:)@MarioTheSpoon我们使用的是记事本和g++编译器,而不是ide:(您是否尝试过使用调试器单步执行它?或者在递归中添加打印语句?为什么输出应该是16030?您的算法试图实现什么?能否提供更多示例并为您的问题添加更多细节?提示:第一次迭代不是100*196+10*3
,而是100*递归(196)+10*3
…@srikfreak-“为什么输出应该是16030?”因为教授说输出应该是这样的!:)@MarioTheSpoon我们使用的是记事本和g++编译器,而不是ide:(我从来没听说过这种方法。但是他们用你的方式描述它。我用你的方式做。我能解决好几个像这样的问题。很好的方法我希望我在高中就学会了lol@NoobCoder基本上,其思想是,对于纯
递归函数(没有副作用,不修改任何其他内容),传递给定值的递归函数的值,一旦你计算出它是某物,它将永远是某物。你可以将它替换为早期的计算。即使它不是纯的,你也可以在第一次从你到达它的地方到达它。我从来没有听说过这种逐步上升的方法。但它们是你的方法我用你的方式写的,我能解决好几个像这样的问题。很好的方法,我希望我在高中就学会了lol@NoobCoder基本上,其思想是,对于纯
递归函数(没有副作用,不修改任何其他内容),传递给定值的递归函数的值,一旦你计算出它是某物,它将永远是某物。你可以将它替换为早期的计算。即使它不是纯的,你也可以先这样做