跟踪这个递归代码

时间:2012-11-27 17:50:02

标签: c++ visual-studio-2010

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

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

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