下面的代码是我的书,我需要跟踪它的执行情况,显示堆栈框架
为每个递归调用创建,存储在堆栈帧中的值和返回的值。我感到困惑的地方在第17行behead(s+1,n-1)
,因为s
是一个字符串变量,所以如何将它添加为整数。由于这个细节,我无法运行此代码。
#define Z 3
string behead( string s, int n );
int main( void )
{
string answer;
char word[] = "distrust";
printf( "\nBeheading the victim: %s?\n", word );
answer = behead( word, Z );
printf( "Now: %s!\n\n", answer );
}
string behead( string s, int n )
{
if (n == 0) return s;
else return behead( s + 1, n - 1 );
}
答案 0 :(得分:2)
我认为移植它的人这样做完全无视实际编译的最终目标。它看起来像一个C-recursive函数,被错误移植,从未测试/编译过。他们可能想要这样的东西:
#include <string>
#include <cstdio>
using namespace std;
#define Z 3
string behead( string s, int n );
int main( void )
{
string answer;
char word[] = "distrust";
printf( "\nBeheading the victim: %s?\n", word );
answer = behead( word, Z );
printf( "Now: %s!\n\n", answer.c_str() );
}
string behead( string s, int n )
{
if (n == 0) return s;
return behead(s.substr(1), n-1);
}
请注意printf参数列表中的c_str()
,这是原始代码中的另一个缺陷。
你问这是做什么的:它从输入字符串的开头递归地拉出一个字符,重复直到n
字符被拉出。通过最终返回的调用堆栈如下,其中s"..."
表示std::string
对象的按值:
behead(s"distrust", 3)
behead(s"istrust", 2)
behead(s"strust", 1)
behead(s"trust", 0) <<== return point.
这也完全没用,因为:
string word = "distrust";
string answer = word.substr(Z);
在没有递归的情况下完成同样的事情(并且更清晰了)。