1

のプロトタイプ制限がbool pal(char str[], int length)あり、ユーザーが入力した文字列が回文であるかどうかをテストする必要があります。私が持っているコードは次のとおりです。

bool pal(char str[], int length)
{
    if(*str == str[length - 1])
    {
        pal(str+1, length-1);
    }
    else
    {
        return false
    }
    return true;
}

しかし、最初の文字が最後の文字と同じであるかどうかをテストしているだけのようです。これは、配列(開始点)がインクリメントされていないためだと思いますが、理由はわかりません。

4

4 に答える 4

4

おそらく、ステートメントに対する根深い嫌悪感によるものifだと思いますが、もしそれが私次第であれば、次のようなコードを書くと思います。

bool pal(char *str, size_t len) { 
    return len <2 || (str[0] == str[len-1] && pal(str+1, len-2));
}
于 2013-02-04T07:18:21.647 に答える
4

コードの作業バージョンを次に示します

bool pal(const char* str, int length)
{
   if(length <2) return true; // base case - 1 or 0 length string is a palindrome.
   if((*str) == str[length - 1])
   {
     return pal(str+1, length-2); // -2 because 1 from front and 1 from back. 
   }
   else
   {
     return false;
   }
    //no return here because the recursive call is returned.
}
于 2013-02-04T07:12:12.333 に答える
1

最初と最後の文字をチェックするので、長さを1ではなく2減らす必要があります。また、内部pal呼び出しの値を返す必要があり、破棄しないでください。

if(*str == str[length - 1])
{
    return pal(str + 1, length - 2);
}

長さが>=2で、strがnullでない場合の追加テストも必要です。

于 2013-02-04T07:02:18.777 に答える
1

あなたの主な問題は、再帰呼び出しの結果で何もしないことです:

 if(*str == str[length - 1])
    {
        pal(str+1, length-1);
    }

おそらく次のようになります。

 if(*str == str[length - 1])
    {
        return pal(str+1, length-1);
    }

また、長さがゼロの文字列や 1 文字しかない文字列などもチェックする必要があります。

于 2013-02-04T07:06:40.327 に答える