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

Pythonでループを使わずに再帰関数だけで数列を出力する方法

ある数 n が与えられたとき、for 文や while 文などのループ構文を一切使わずに、n から始めて 5 ずつ減算し 0(または負の値)に達した後、今度は 5 ずつ加算しながら再び n まで戻る数列を出力する方法を紹介します。この問題は再帰関数を使うことでエレガントに解決できます。

実行例

入力: n = 15
出力: 15 10 5 0 5 10 15

アルゴリズム

ステップ1: 数値 n を受け取ります。
ステップ2: n に向かって戻る途中であり、すでに n に到達していれば処理を終了します。
ステップ3: 現在、0 または負の値へ向かって減算している段階かどうかを確認します。
ステップ4: 現在の値が 5 より大きければ、フラグ True のまま再帰呼び出しを行います。それ以外の場合はフラグ False で再帰呼び出しします。
ステップ5: 値が 5 より大きくなければ、フラグを False に切り替えます。

サンプルコード

def printm(p, q, flag):
   print(q)
   # フラグがFalseで、pとqが一致したら再帰を終了
   if flag == False and p == q:
      return
   if flag:
      if q - 5 > 0:
         printm(p, q - 5, True)   # まだ正の値なので減算を続ける
      else:
         printm(p, q - 5, False)  # フラグをFalseにして再帰呼び出し
   else:
      printm(p, q + 5, False)     # フラグがFalseなら加算しながらnへ戻る
# 実行コード
n = 15
printm(n, n, True)

出力結果

15
10
5
0
5
10
15

コードの仕組み

このプログラムのポイントは、引数 flag によって「減算フェーズ」と「加算フェーズ」を切り替えている点です。

  • flag が True の間: 引数 q から 5 を引いて再帰呼び出しを続けます。q - 5 が 0 以下になると、フラグを False に切り替えます。
  • flag が False になると: 今度は 5 を足しながら再帰呼び出しを行い、q が最初の値 p と一致した時点で再帰を終了します。

このように再帰を活用すれば、ループ構文を一切使わずに同じ処理を実現できます。ただし、再帰の呼び出しが深くなりすぎると RecursionError が発生する可能性があるため、扱う数値の大きさには注意しましょう。

  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つの関数

  2. ループを使わずに数列を出力する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に