本文へスキップ
BecomeCoder

Perlコース · 第6章 サブルーチン · レッスン21

再帰 ― 自分自身を呼ぶ

ブラウザで完結

導入

サブルーチンは、自分自身を呼び出すこともできます。これを再帰といい、階乗やフィボナッチのように「小さな同じ問題」に分けられる計算に向いています。

説明

再帰には必ず「これ以上分けない終わりの条件(ベースケース)」が要ります。無いと無限に呼び出して止まりません。階乗(n! = n × (n-1) × ... × 1)で見てみましょう。

use strict;
use warnings;

sub factorial {
    my $n = shift;
    return 1 if $n <= 1;              # ベースケース
    return $n * factorial($n - 1);   # 自分自身を呼ぶ
}

print factorial(5), "\n";            # 120

後置の return ... if ...; が、ベースケースを1行で書くのに役立っています。

flowchart TB
  f5["factorial(5)"] -->|"5 ×"| f4["factorial(4)"]
  f4 -->|"4 ×"| f3["factorial(3)"]
  f3 -->|"3 ×"| f2["factorial(2)"]
  f2 -->|"2 ×"| f1["factorial(1) = 1<br/>(ここで止まる)"]
  f1 -.->|"1"| f2
  f2 -.->|"2"| f3
  f3 -.->|"6"| f4
  f4 -.->|"24"| f5
  f5 -.->|"120"| ans["答え 120"]

やってみよう

factorial に渡す数を変えて結果を確かめましょう。小さめの数で試してください。

演習

1 から n までの合計を再帰で求めるサブルーチン sum_to を定義し、sum_to(10) を表示してください(結果は 55)。

ヒント1を見る

sub sum_to { my $n = shift; return 1 if $n <= 1; return $n + sum_to($n - 1); }

実際に動かしてみよう

下のエディタにPerlを書いて「実行」を押すと、学習用シミュレータが print / say の出力を表示します(本物のperlではなく、教材の範囲を再現した軽量なエンジンです)。スカラ/配列/ハッシュ・制御構文・サブルーチン・正規表現(=~ / s///)なども動きます。本文の例を書き換えて動かしてみましょう(ファイル入出力・リファレンス・CPANモジュールなど一部の機能は対象外です)。

Perl — ブラウザ内で実行(学習用シミュレータ)

Perlの教材サブセットを動かす学習用シミュレータを読み込みます(本物のperlではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。