C++で配列・文字列を逆順にするプログラムの作成方法【反復・再帰の2つの手法を解説】
この記事では、与えられた配列または文字列の要素を逆順に並び替えるC++プログラムの作成方法を解説します。配列と文字列はどちらも同じ手順で処理できるため、基本的な考え方を一度覚えれば両方に応用できます。
まず、具体例を使って問題を確認しましょう。
入力例(配列の場合)
array = {2, 5, 7, 1, 9}
出力例
{9, 1, 7, 5, 2}
入力例(文字列の場合)
string = "Hello!"
出力例
!olleH
逆順にする仕組み
配列(文字列も同様)を逆順にするには、先頭と末尾の要素を順番に交換していく方法が基本です。具体的には、次の手順で処理を行います。
- 先頭位置を示す変数「start」と、末尾位置を示す変数「end」を用意する。
- startが指す要素とendが指す要素を交換する。
- startを1つ後ろへ、endを1つ前へ移動させる。
- startがend未満である限り、手順2〜3を繰り返す。
この処理により、外側から内側へ向かって要素が対になって入れ替わり、最終的に配列全体が逆順になります。
このアルゴリズムの実装方法には、ループを使う反復処理による方法と、関数の自己呼び出しを使う再帰処理による方法の2通りがあります。以下では、それぞれの動作をサンプルコードで紹介します。
サンプルプログラム1:反復処理による実装
#include <iostream>
using namespace std;
void reverseArrayIt(int arr[], int start, int end){
while (start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
int main() {
int arr[] = {6, 9, 1, 4, 0, 5};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"Original Array : ";
for (int i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
reverseArrayIt(arr, 0, n-1);
cout << "Reversed array : ";
for (int i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
実行結果
Original Array : 6 9 1 4 0 5 Reversed array : 5 0 4 1 9 6
while文の中で、startとendが指す要素を一時変数tempを介して交換しています。交換のたびにstartを増加、endを減少させ、両者が交差した時点でループを終了します。処理がシンプルで理解しやすく、最も一般的な実装方法です。
サンプルプログラム2:再帰処理による実装
#include <iostream>
using namespace std;
void reverseArrayRec(int arr[], int start, int end){
if(start >= end)
return;
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
reverseArrayRec(arr, start+1, end-1);
}
int main() {
int arr[] = {6, 9, 1, 4, 0, 5};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"Original Array : ";
for (int i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
reverseArrayRec(arr, 0, n-1);
cout << "Reversed array : ";
for (int i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
実行結果
Original Array : 6 9 1 4 0 5 Reversed array : 5 0 4 1 9 6
再帰版では、startがend以上になった時点(すべての交換が完了した時点)で関数を終了するのが基底条件です。両端の要素を交換した後、探索範囲を狭めながら自分自身を再度呼び出すことで、反復版とまったく同じ処理を実現しています。
まとめ
どちらの方法でも計算量はO(n)で、実行結果は同一です。反復処理は関数呼び出しのオーバーヘッドがなくメモリ効率に優れる一方、再帰処理はロジックが簡潔に表現できるという利点があります。また、文字列の場合も先頭と末尾の位置を同じように扱えば、同じアルゴリズムで逆順にできます。なお、実務では標準ライブラリのstd::reverse()を利用することで、より簡単に逆順処理を行うことも可能です。
-
C言語で配列を逆順に反転させるプログラムの書き方
配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭