導入
サブルーチンは、自分自身を呼び出すこともできます。これを再帰といい、階乗やフィボナッチのように「小さな同じ問題」に分けられる計算に向いています。
説明
再帰には必ず「これ以上分けない終わりの条件(ベースケース)」が要ります。無いと無限に呼び出して止まりません。階乗(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); }。