【C言語】ループ文やgoto文を使わずに名前を10回出力する方法
はじめに
C言語では、同じ処理を繰り返し実行したい場合、通常はfor文やwhile文などのループ文を使用します。しかし、「ループ文もgoto文も一切使わずに、同じ文字列(名前)を複数回出力せよ」という課題に挑戦してみましょう。
この記事では、再帰呼び出し(リカージョン)を使った解決方法を中心に、サンプルコードと実行結果を交えてわかりやすく解説します。
問題の概要
課題は次のとおりです。
- ユーザーから名前を入力してもらう
- その名前を10回画面に出力する
- ただし、ループ文(for / while / do-while)およびgoto文は使用禁止
通常、コードブロックを繰り返すにはループ文が使われますが、条件がfalseになるまで処理を繰り返す仕組み自体は、関数の再帰呼び出しでも実現できます。
解決方法:再帰呼び出しを使う
ポイントとなるのは「自分自身を呼び出す関数」です。関数内で回数をカウントしながら、条件を満たしている間は自分自身を再度呼び出すことで、ループ文なしで繰り返し処理を実現します。
サンプルコード1:再帰による実装
次のプログラムでは、printname関数が自分自身を呼び出すことで、ループ文やgoto文を使わずに名前を10回出力しています。
#include <stdio.h>
void printname(char *name, int count) {
printf("%03d : %s\n", count + 1, name);
count += 1;
if (count < 10)
printname(name, count); // 自分自身を再度呼び出す
}
int main() {
char name[50];
printf("\nEnter you name :");
scanf("%s", name);
printname(name, 0);
return 0;
}プログラムの流れ
- main関数で名前を入力として受け取る
- printname関数に名前と初期値0を渡して呼び出す
- printfで現在の回数と名前を出力する
- countを1増やし、countが10未満であれば再びprintnameを呼び出す
- countが10に達した時点で再帰呼び出しが止まり、処理が終了する
実行結果
Enter you name :tutorialspoint 001 : tutorialspoint 002 : tutorialspoint 003 : tutorialspoint 004 : tutorialspoint 005 : tutorialspoint 006 : tutorialspoint 007 : tutorialspoint 008 : tutorialspoint 009 : tutorialspoint 010 : tutorialspoint
番号付きで見やすく出力されているのがわかります。「%03d」という書式指定子により、回数が常に3桁で表示されます。
比較用サンプル:通常のfor文を使った場合
参考までに、一般的なループ文を使って同じ処理を行うプログラムも紹介します。
#include <stdio.h>
int main() {
char name[50];
int i;
printf("\nEnter you name :");
scanf("%s", name);
for (i = 0; i < 10; i++) {
printf("%s\n", name);
}
return 0;
}実行結果
Enter you name :TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint TutorialsPoint
補足:再帰とループの違い
どちらのコードも結果は同じですが、内部動作には違いがあります。
- for文: 同じ関数内で変数iの値を変えながら繰り返すため、メモリ効率が良い
- 再帰呼び出し: 呼び出しごとにスタック領域が積まれるため、深い再帰ではスタックオーバーフローに注意が必要
ただし、再帰は「木構造の探索」「階乗計算」「フィボナッチ数列」など、問題を小さく分割して解くタイプのアルゴリズムと非常に相性が良い手法です。今回のような単純な繰り返しでも、再帰の基本的な考え方を学ぶのに最適な例と言えます。
まとめ
- ループ文やgoto文を使わずに繰り返し処理を行うには、再帰呼び出しを利用する
- 関数内でカウンタを管理し、終了条件(今回はcount < 10)を必ず設けることが重要
- 終了条件がないと無限に呼び出され続け、スタックオーバーフローを引き起こすので注意
再帰の考え方をマスターすると、より高度なアルゴリズムにも応用できるようになります。ぜひ実際にコードを書いて動かしてみてください。
-
JavaScriptのforループをフローチャートで図解!仕組みと基本構文をわかりやすく解説
JavaScriptのforループとは? JavaScriptにおける「for」ループは、同じ処理を繰り返し実行するための基本的な制御構造です。forループは主に3つの要素で構成されており、それぞれが明確な役割を持っています。 1. ループの初期化 まず最初にループの初期化が行われます。ここでは、カウンターとして使う変数に開始値を設定します。この初期化文は、ループ本体が始まる前に一度だけ実行されるのが特徴です。 2. 条件判定(テスト文) 次に条件判定が行われ、指定された条件が真(true)かどうかが評価されます。条件がtrueであれば、ループ内に記述されたコードが実行されます。一方、fa
-
C++でループ・再帰・gotoを使わずに文字をn回出力する方法
この記事では、C++においてループ(for文・while文)や再帰、goto文を一切使わずに、指定した文字をn回出力する方法を解説します。一見すると繰り返し処理にはループが必須に思えますが、実は std::string クラスのコンストラクタを活用することで、非常にシンプルにこの問題を解決できます。stringクラスのコンストラクタを利用するstd::string には、「文字」と「その繰り返し回数」を受け取るコンストラクタが用意されています。書式は以下のとおりです。string(繰り返し回数, 出力したい文字);例えば string(10, B) と書くと、「B」が10個並んだ文字列 BBB