「うさぎの数が世界人口を越えるには」をやってみる

30分プログラム、その583。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_126をやってみる。

もともとフィボナッチ数は、つがいのうさぎの数を数える時の数列なので、何ヶ月目に現在の世界人口である 66 億 6000 万人をうさぎが越えるかを調べてみます。

フィボナッチ数の計算は、有名なO(n)のアルゴリズムを使いました。

使い方

$ perl fib.pl
1 2
2 2
3 4
4 6
5 10
6 16
7 26
8 42
9 68
10 110
11 178
12 288
13 466
14 754
15 1220
16 1974
17 3194
18 5168
19 8362
20 13530
21 21892
22 35422
23 57314
24 92736
25 150050
26 242786
27 392836
28 635622
29 1028458
30 1664080
31 2692538
32 4356618
33 7049156
34 11405774
35 18454930
36 29860704
37 48315634
38 78176338
39 126491972
40 204668310
41 331160282
42 535828592
43 866988874
44 1402817466
45 2269806340
46 3672623806
47 5942430146
48 9615053952

もとのやつとはfib(0)の値が違うので、1月ほどずれが生じています。

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# fact.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/05/14 21:06:52
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;

sub fib_iter($$$) {
    my ($current,$prev,$n) = @_;
    if ($n == 1) {
	$current;
    }else{
	&fib_iter($current+$prev,$current,$n-1);
    }
}

sub fib($){
    my ($n) = @_;
    fib_iter(1,0,$n);
}

for (my $i = 1; ; $i++) {
    my $rabbit = 2 * fib($i);
    print "$i $rabbit\n";
    if($rabbit > 6660000000){
	exit;
    }
}