Snippets

sironekotoro H30 高度情報 午前1 問2 の再帰問題をPerlで解いてみる

Created by sironekotoro
use strict;
use warnings;
use feature qw/say/;

# H30 高度情報 午前1 問2
# https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30.html#30haru

# 問2 非負の整数 m, n に対して次のとおりに定義された関数
# Ack (m, n) がある。
# Ack (1, 3) の値はどれか。
# Ack(m,n) = Ack(m-1, Ack(m,n-1) ) (m>0かつn>0のとき )
# Ack(m,n) = Ack(m-1, 1 )          (m>0かつn=0のとき )
# Ack(m,n) = n+1                   (m=0のとき )

say Ack( 1, 3 );

sub Ack {

    my ( $m, $n ) = @_;

    say '-' x 10;


    if ( $m > 0 && $n > 0 ) {
        say "引数:m:$m,n:$n";
        say " m > 0 かつ n > 0";
        say '返り値:Ack('. ( $m - 1 ). ', Ack('. $m . ','. ( $n - 1 ) . ') )';
        return Ack( $m - 1, Ack( $m, $n - 1 ) );
    }
    elsif ( $m > 0 && $n == 0 ) {
        say "引数:m:$m,n:$n";
        say " m > 0 かつ n = 0";
        say '返り値:Ack('. ( $m - 1 ). ', 1)';
        return Ack( $m - 1, 1 );
    }
    elsif ( $m == 0 ) {
        say "引数:m:$m n:$n";
        say " m = 0";
        say "返り値:" . ($n + 1);
        return $n + 1;
    }
    say '-' x 10;
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.