1

次のようなものがあるとします: (出力を予測します)

void abc (char *s){

    if(s[0]=='\0')
        return;

    abc(s+1);
    abc(s+1);

    printf(“%c “, s[0]);
}

解決するのは難しくありませんが、時間がかかりすぎて、再帰と変数の値を見失うため、そのような質問を2〜3回やり直さなければなりません(特に、そのような再帰ステートメントが2〜3ある場合)

このような問題を解決しなければならない場合、何か良い方法はありますか?

4

3 に答える 3

1

基本的なテクニックは、最初は小さな入力から始めることです。次に、1 つ大きいもので試します。次に、それよりも大きいもので試してください。再帰関数の場合、前の関数がどのように見えるかを知っていれば、次の関数がどのようになるかを予測できるパターンが出現するはずです。

それでは、空の文字列から始めましょう。簡単です。何も印刷されません。

input: ""
output:

次は長さ 1 の文字列です。ほぼ同じように、2 つの再帰呼び出しはそれぞれ何もせず (空の文字列の場合)、文字列の文字が出力されます。

input: "z"
output: z

次は長さ 2 の文字列です。再帰呼び出しのそれぞれは、最終的に 2 番目の文字 (大文字と小文字が 1 文字の長さの文字列) を出力し、次に最初の文字を出力します。

input: "yz"
output: zzy

では、長さ 3 の文字列の場合に何が起こるかを予測してみましょう。何が起こるかというと、最初の文字を除外した部分文字列が 2 回処理され、最初の文字が出力されます。その部分文字列は、長さ 2 の文字列です。そう:

input: "xyz"
output: zzyzzyx

したがって、現在の出力シーケンスから次の出力シーケンスを導き出す方法は明らかです。

于 2013-08-22T10:35:11.927 に答える