c++ - 不理解此递归函数中的返回 (C++)
问题描述
string stringtest(const string& s, int size, int index, string res){
if(index == size){return res;}
char c = s.at(index);
if(isalpha(c)){ res+= c ; }
**return** stringtest(s,size,index+1,res);
}
string stringtest(const string& s){
int size = s.size();
string r = "";
return stringtest(s,size,0,r);
}
int main(){
cout << stringtest("1a2bc3def") << endl;
return 0;
}
你好。这是我为学习递归而编写的一段代码。
我不明白的是辅助函数 stringtest(string,size,index,result) 中返回的功能 - 我只想在最后返回结果,为什么每次都返回函数调用?
编辑
所以..是因为当我返回 res 时它返回到调用函数,并且因为我从不返回那些函数调用,所以它永远不会回到我在 main 中调用 stringtest("1a2...") 的位置?
解决方案
要理解的关键是,return
后面跟着一些表达式不会立即返回一些值。它计算表达式(表示递归调用),然后返回计算表达式计算的值。您缺少在返回某个值之前完成的中间计算。
在这个中间计算中,由于递归,它将启动另一个中间计算,其结果将在计算后返回。这些中间计算不断启动,直到达到递归的基本情况。
如果没有最后的return
语句,因为函数具有非 void 返回类型,您会遇到未定义的行为。
推荐阅读
- javascript - 对 beforeunload 进行 ajax 调用不会从 selenium chromedriver 触发?
- docker - 运行 docker pull “net/http:请求在等待连接时取消”时出错
- java - 收到这个`错误:内部错误:(java.lang.ClassNotFoundException)com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index`
- angular - Angular 8 未能部署到 Github Pages -
- java - 在片段中强制转换 Activity 以从 parentActivity 调用方法是否安全?
- c++ - 在基于命令行的 QT 插件构建中包含库
- javascript - 使用 javascript/jquery 访问嵌套 json 中未知父对象的子对象
- django - Preview custom 500 error page in Wagtail?
- java - 如何更改匿名类中的实例变量
- firebase-hosting - 基于浏览器语言的 Firebase 托管重写规则