不理解此递归函数中的返回 (C++)
Not understanding return in this recursive function (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(字符串,大小,索引,结果(中返回的功能 - 我只想在最后返回结果,为什么每次都返回函数调用?
编辑
那么..是因为当我返回 res 时它会返回到调用函数,并且由于我从不返回这些函数调用,那么它永远不会回到我主要调用 stringtest("1a2..."( 的位置?
要理解的关键是,return
后跟某个表达式不会立即返回某个值。它计算表达式(表示递归调用(,然后返回计算表达式计算的值。您缺少在返回某个值之前完成的中间计算。
在此中间计算中,由于递归,它将启动另一个中间计算,一旦计算出来,它将返回其结果。这些中间计算不断启动,直到达到递归的基本情况。
如果末尾没有return
语句,由于该函数具有非 void 返回类型,因此会遇到未定义的行为。
我不
明白的是返回在 辅助函数字符串测试(字符串,大小,索引,结果( - 我只想 最后返回结果,为什么每个都返回函数调用 时间?
总是允许(并且相对容易(添加一对可移动的cout来显示说明递归/诅咒操作的"图形"。 每个函数调用(字符串测试(((在调用后返回到行。
我添加了一个参数来跟踪递归级别"size_t rLvl"。 请注意,在递归中恢复了 rLvl。 rLvl 用于替换当前值,因此在递归期间增加 rLvl 会将"res"的中间值向右推,而在递归期间恢复 rLvl 将恢复诅咒报告与相应递归报告的对齐。
#include <iostream>
using std::cout, std::endl; // c++17
#include <iomanip>
using std::setw;
#include <string>
using std::string, std::to_string;
string stringtest(size_t rLvl, // recurse lvl
const string& s, size_t size, size_t index, string res)
{
int w = static_cast<int>(2*rLvl);
if(index == size) // recursion termination clause
{
int sz = static_cast<int>(s.size());
cout << "n " << setw(3) << rLvl
<< " " << s << setw(w-sz-4) << " "
<< res << " <<<<< end-of-recursion";
return res;
}
char c = s.at(index);
if(isalpha(c)) { res += c; } // append c when it is alpha
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
cout << "n " << setw(3) << rLvl // recurse report
<< setw(w) << " "
<< setw(4) << res << " ";
string temp = stringtest(rLvl+1, // recurse lvl // recursion invocation
s, size, index+1, res);
cout << "n " << setw(3) << rLvl // decurse report
<< setw(w) << " "
<< setw(4) //<< "-"
<< res << '_'; //<< ")";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return temp;
}
string stringtest(const string& s)
{
size_t size = s.size();
string r = "";
return stringtest(1, s, size, 0, r);
}
int main()
{
string res = stringtest("1a2bc3def");
cout << "nn result: " << res << endl;
return 0;
}
输出:
1
2 a
3 a
4 ab
5 abc
6 abc
7 abcd
8 abcde
9 abcdef
10 1a2bc3def abcdef <<<<< end-of-recursion
9 abcdef_
8 abcde_
7 abcd_
6 abc_
5 abc_
4 ab_
3 a_
2 a_
1 _
result: abcdef
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值