1

下面的代码是我的书,我需要跟踪它的执行,显示为每个递归调用创建的堆栈帧、存储在堆栈帧中的值以及返回的值。我感到困惑的地方是第 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 );
}
4

1 回答 1

2

认为移植此内容的人完全无视实际编译的最终目标。它看起来像一个移植不良且从未测试/编译过的 C 递归函数。他们很可能想要这样的东西:

#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);
}

请注意c_str()在 printf 参数列表中,原始代码中的另一个缺陷。

你问这是做什么的:它递归地从输入字符串的开头拉出一个字符,重复直到n拉出字符。通过最终返回的 this 的调用堆栈如下,其中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);

在没有递归的情况下完成同样的事情(并且更清楚)。

于 2012-11-27T18:02:20.250 回答