Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】再帰を使って配列が回文かどうかを判定するプログラム

配列 arr[n](n は配列のサイズ)が与えられたとき、再帰を用いてその配列が回文かどうかを判定するのが本記事のテーマです。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、「MADAM」や「NAMAN」などが代表的な例です。

配列が回文かどうかを調べるには、先頭と末尾から順に要素を比較していきます。

【C言語】再帰を使って配列が回文かどうかを判定するプログラム

再帰的なアプローチでも同様に、start と end の値を更新しながら比較を続けます。start と end が交差(すれ違う)すれば回文と判定でき、途中で要素が一致しなかった場合はそこで処理を打ち切り、false を返します。

入力例と出力例

入力: arr[] = { 2, 3, 4, 3, 2}
出力: はい、この配列は回文です
説明: 先頭から見た並び (2, 3, 4, 3, 2) と末尾から見た並び (2, 3, 4, 3, 2) が同一であるため。

入力: arr[] = {1, 2, 3, 4}
出力: いいえ、この配列は回文ではありません
説明: 先頭から見た並び (1, 2, 3, 4) と末尾から見た並び (4, 3, 2, 1) が同一ではないため。

アプローチの考え方

今回採用するアプローチでは、以下のステップを再帰的に実行します。

  • arr[start] と arr[end] が等しく、かつ start < end であるかを確認する
  • start を 1 増やし、end を 1 減らす
  • ステップ 1 に戻る

アルゴリズム

開始
関数 int palindrome(int arr[], int start, int end)
    ステップ 1 -> もし start >= end ならば、
        1 を返す
    ステップ 2 -> もし arr[start] == arr[end] ならば、
        palindrome(arr, start + 1, end - 1) を返す
    ステップ 3 -> それ以外の場合 {
        0 を返す
関数 int main()
        ステップ 1 -> 配列 arr[] を宣言・初期化する
        ステップ 2 -> n = sizeof(arr) / sizeof(arr[0]) を宣言・初期化する
        ステップ 3 -> もし palindrome(arr, 0, n - 1) == 1 ならば、
            「Yes, the array is Palindrome」と出力する
        ステップ 4 -> それ以外の場合
            「No, the array is not Palindrome」と出力する
終了

C言語での実装例

#include <stdio.h>
// 回文であれば 1 を、そうでなければ 0 を返す再帰関数
int palindrome(int arr[], int start, int end) {
   // ベースケース
   if (start >= end) {
      return 1;
   }
   if (arr[start] == arr[end]) {
      return palindrome(arr, start + 1, end - 1);
   } else {
      return 0;
   }
}
// ドライバーコード
int main() {
   int arr[] = { 1, 2, 0, 2, 1 };
   int n = sizeof(arr) / sizeof(arr[0]);
   if (palindrome(arr, 0, n - 1) == 1)
      printf("Yes, the array is Palindrome\n");
   else
      printf("No, the array is not Palindrome\n");
   return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

Yes, the array is Palindrome

計算量について

この再帰アプローチでは、配列の先頭と末尾を同時に比較していくため、比較回数はおよそ n/2 回となります。したがって時間計算量は O(n)、再帰呼び出しによるスタック領域も O(n) 必要になります。ループを使った反復処理に比べコードは簡潔になりますが、大きな配列を扱う場合はスタックオーバーフローに注意が必要です。

  1. C言語で配列が回文かどうかを判定するプログラム

    回文とは任意のサイズ n の配列 arr[] が与えられたとき、その配列が回文(パリンドローム)かどうかを判定するのが本記事の目的です。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、MADAM や NAMAN といった文字列が代表的な例として挙げられます。配列が回文かどうかを確認するには、配列を先頭からと末尾から同時に走査し、対応する要素同士を比較していきます。入力例と出力例Input: arr[] = {1, 0, 0, 1} Output: 配列は回文です Input: arr[] = {1, 2, 3, 4, 5} Output: 配列は回文ではありません考え方(アプ

  2. C++のSTLを使って配列が回文かどうかを判定するプログラム

    整数 n 個からなる配列 arr[n] が与えられたとき、「その配列は回文(パリンドローム)か?」を判定するのが本稿のテーマです。C++ の STL(標準テンプレートライブラリ)を活用して、この問題をシンプルに解いていきます。 STLとは STL(Standard Template Library)は、C++ に用意されたテンプレートクラスの集合体で、スタック・キュー・リストといったデータ構造や、ソート・反転などの便利な関数を提供します。これらを活用するには、テンプレートクラスに関する基本的な知識が必要です。本稿では、STL の reverse() 関数を使って配列を反転させています。 回文と