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 引数リストに注意してください。

あなたはこれが何をするのか尋ねました: 入力文字列の先頭から 1 文字を再帰的に取り出し、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);

再帰なしで同じことを達成します(そして、非常に明確です)。

于 2012-11-27T18:02:20.250 に答える