0

私は大学でこの演習を割り当てられましたが、再帰構造(コードの「???」)を実装する方法がわかりません。ifサイクルでは、配列の最初の文字を最後の文字と一致させ、中央の文字に到達するために再帰を適用する必要がありますが、コードの設定方法がわかりません。主な機能コードは完全にコンパイルされます。

#include <iostream>

using namespace std;

const int DIM = 8;

bool is_palindrome (char* first, char* last)
{
    if (first == last)
    {
        ???
    }
    else
     return false;
}

int main()
{
    char a[DIM] = {'i','n','g','e','g','n','i','\0'};
    char *first = &a[DIM] + 1;
    char *last = &a[DIM] -1;

    if (is_palindrome(first, last))
        cout << " the char array is palindrome ";
    else
            cout << " the char array is not palindrome ";

    return 0;
}
4

2 に答える 2

2

まず、ポインター自体ではなく、ポインターが指す値を比較する必要があります。

if (*first == *last)

次に、最初の文字を進めて最後の文字を減らして、1 文字移動することができます。

// inside if
++first;
--last;

ポインターの新しい値を使用して関数を再度呼び出します。

return is_palindrome(first, last);

また、実際に回文を取得したときに配列を通過しないようにする必要があるため、このチェックを配列の先頭に追加します。is_palindrome()

if (last < first) {
  return true;
}

また、次のmain()ようにポインタを初期化する必要があります。

char* first = &a[0];
char* last = &[DIM-2];

あなたが書いた方法は、firstすでに配列を過ぎて指している一方で、他の文字のいずれとも一致しないlast末尾を指しています。'\0'

于 2012-06-07T20:59:21.440 に答える
0
using namespace std;

const int DIM = 8;

bool is_palindrome ( char* first , char* last )
{
    if ( *first == '\0' )
    {
        return false;
    }
    else if ( first >= last )
    {
        return true;
    }
    else if ( *first == *last )
    {
        return is_palindrome(first + 1, last - 1);
    }
    else
    {
        return false;
    }
}

int main ()
{
    char a[DIM] = {'i','n','g','e','g','n','i','\0'};
    char *first = a;
    char *last = &a[DIM] - 2;

    if ( is_palindrome ( first , last ) )
    {
        cout << " the char array is palindrome ";
    }
    else
    {
        cout << " the char array is not palindrome ";
    }

    return 0;
}
于 2012-06-07T20:55:51.953 に答える