C言語でループを使わずに数列を出力するプログラムの書き方
この問題では、2つの整数 N と K が与えられます。求められているのは、ループ(for文・while文など)を一切使わずに特定の規則に従った数列を出力するプログラムを作成することです。
出力すべき数列は、N から始まり、K ずつ減算していき、値が0以下になった時点で今度は K ずつ加算して、再び N に戻るまで続けます。そして重要なのは、この一連の処理においていかなる種類のループも使用してはならないという点です。
入出力例
具体的な例を見て、問題の内容を確認しましょう。
入力
n = 12 , k = 3
出力
12 9 6 3 0 3 6 9 12
12から始まって3ずつ減り、0になった後は3ずつ増えて再び12まで戻っているのが分かります。
解き方:再帰呼び出しを活用する
ループを使わずにこの問題を解くには、再帰(リカーション)を利用します。自分自身を繰り返し呼び出す再帰関数を作成し、現在の値を常にチェックすることで、「加算」と「減算」のどちらの操作を行うべきかを判定します。
関数内ではフラグ(bool型変数)を使用します。このフラグによって、現在の値に対して減算を行う段階なのか、加算を行う段階なのかを追跡できます。
- フラグが
trueの間は、値が0以下になるまで K を減算しながら再帰呼び出しを続けます。 - 値が0以下になった時点でフラグを反転(
false)し、以降は K を加算しながら再帰呼び出しを行います。 - フラグが
falseの状態で値が N に到達したら、処理を終了します。
C言語(C++)による実装コード
以下は、ループを使わずに数列を出力するサンプルプログラムです。
#include <iostream>
using namespace std;
void PrintSeriesRec(int current, int N, int K, bool flag){
cout << current << "\t";
if (current <= 0)
flag = !flag;
if (current == N && !flag)
return;
if (flag == true)
PrintSeriesRec(current - K, N, K, flag);
else if (!flag)
PrintSeriesRec(current + K, N, K, flag);
}
int main(){
int N = 12, K = 4;
cout << "The series is : \n";
PrintSeriesRec(N, N, K, true);
return 0;
}実行結果
The series is : 12 8 4 0 4 8 12
コードの解説
このプログラムの動作を順番に見てみましょう。
- 初期状態:
PrintSeriesRec(N, N, K, true)を呼び出し、フラグをtrue(減算モード)に設定します。 - 減算フェーズ: 現在の値を出力した後、まだ0より大きければ
current - Kで自身を再帰的に呼び出します。 - フラグの切り替え: 値が0以下になったら
flag = !flagでフラグを反転し、加算モードに移行します。 - 加算フェーズ: フラグが
falseの間はcurrent + Kで再帰呼び出しを続けます。 - 終了条件: フラグが
falseのまま値が N と等しくなった時点でreturnにより再帰を終了します。
このように再帰を利用すれば、for文やwhile文などのループ構文を一切使わずに、減算→加算という往復の数列を簡潔に出力できます。再帰の各呼び出しがループの1回分の処理に相当すると考えると理解しやすいでしょう。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに