不理解此递归函数中的返回 (C++)

Not understanding return in this recursive function (C++)

本文关键字:C++ 返回 递归函数 不理解      更新时间:2023-10-16
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