Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的递归+;_C++_Recursion - Fatal编程技术网

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基本上,其思想是,对于
递归函数(没有副作用,不修改任何其他内容),传递给定值的递归函数的值,一旦你计算出它是某物,它将永远是某物。你可以将它替换为早期的计算。即使它不是纯的,你也可以先这样做