C++でループを使わずに数値パターンを出力する方法(再帰の活用)
この問題では、数値 n が与えられます。n から始めて 5 ずつ値を減算しながら 0 または負の値に達するまで出力し、その後再び元の数値まで増加させながら出力するパターンを作成します。
まず、具体例で問題を確認してみましょう。
入力: n = 12 出力: 12 7 2 -3 2 7 12
解決アプローチ
この問題は再帰(リカージョン)を使うことで解決できます。for 文や while 文などのループを使用せず、関数が自分自身を呼び出す仕組みを利用して、値の減少と増加の両方の処理を実現します。
再帰の流れは以下の通りです。
- 値が正の間は、現在の値を出力し、5 を引いた値で自分自身を再帰的に呼び出します。
- 値が 0 以下になった時点で再帰の底に達し、そこから呼び出し元へ処理が戻りながら、各段階の値が再度出力されます。
このように、再帰呼び出しの「降りていく過程」と「戻っていく過程」の両方で出力を行うことで、減少パターンと増加パターンを一度に出力できます。
実装例
以下のコードは、この解決策の実装例です。
#include <iostream>
using namespace std;
void printNextValue(int m){
if (m > 0){
cout << m << '\t';
printNextValue(m - 5);
}
cout << m << '\t';
}
int main(){
int n = 13;
cout << "The pattern is:\n";
printNextValue(n);
return 0;
}出力
The pattern is − 13 8 3 -2 3 8 13
コードの動作解説
n = 13 の場合のプログラムの動作を順に追ってみましょう。
- printNextValue(13) が呼ばれ、13 を出力した後、printNextValue(8) を呼び出します。
- 同様に 8 → 3 と出力しながら再帰が進み、printNextValue(-2) が呼ばれます。
- m = -2 は 0 以下のため if 文の内部はスキップされ、-2 のみが出力されます。
- その後、再帰呼び出しが順に呼び出し元へ戻りながら、3、8、13 と再度出力されます。
結果として、「13 8 3 -2 3 8 13」という、一度減少してから再び増加するパターンが、ループを一切使わずに出力されます。再帰の呼び出しスタックが自動的に「増加フェーズ」の記憶を保持してくれるため、フラグ変数などを明示的に管理する必要がないのがポイントです。
-
【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に