再帰でFizzBuzz

Javaで三項演算子/再帰/StaticInitializerを使ったFizzBuzzを試してみたを見て。

再帰で書く場合まず以下を思い浮かべるので、ちょっと書き方が変わります。

  • n-1 まではよろしくやってもらって n の時を頑張る
  • 一つを自分がやって、残りを丸投げ

リンク先はJavaで書かれていましたが、手元のマシンにjavacが入っていないのでここではPerlで(Deep recursion on subroutineの警告が出ますね)。

use strict;
use warnings;

fizzbuzz(100);

# n-1 まではよろしくやってもらって n の時を頑張る
sub fizzbuzz {
	my $n = shift;
	
	return if $n == 0;
	fizzbuzz($n - 1); # n-1 まではよろしく
	
	if ($n % 15 == 0) {
		print "FizzBuzz\n";
	} elsif ($n % 5 == 0) {
		print "Buzz\n";
	} elsif ($n % 3 == 0) {
		print "Fizz\n";
	} else {
		print "$n\n";
	}
}
use strict;
use warnings;

fizzbuzz(1..100);

# 一つを自分がやって、残りは丸投げ
sub fizzbuzz {
	return if @_ == 0;
	
	my $n = shift; # 一つ
	my @list = @_; # 残り
	
	if ($n % 15 == 0) {
		print "FizzBuzz\n";
	} elsif ($n % 5 == 0) {
		print "Buzz\n";
	} elsif ($n % 3 == 0) {
		print "Fizz\n";
	} else {
		print "$n\n";
	}
	
	fizzbuzz(@list);
}

後者の方法はリンク先の方法と同じ考え方なのかもしれませんが、再帰呼び出し時に残り部分が減っている感がないところに若干違和感を感じます。実際は(k, n)で呼ばれた時に自分でkを処理して(k+1, n)を丸投げしているので残り部分が減っているというのは同じなのですけど、+1というのがどうも。

気になったのでちょっと検索してみました。括弧内は使用言語です。

私は、少数派ですかね。