#!/usr/bin/perl

# 使用遞迴方法 (recursive)
# 輸入 : 正整數 n
# 輸出 : 階乘 n!
sub factorial {
    my $n = shift;

    return 'NaN' if ($n<0);
    return 1 if ($n<2);
    return $n*factorial($n-1);
}

# 使用疊代方法 (iterative)
# 輸入 : 正整數 n
# 輸出 : 階乘 n!
sub factorial_i {
    my $n = shift;
    my $fact = 1;

    return 'NaN' if ($n<0);
    while ($n>1) {
        $fact *= $n;
        $n = $n - 1;
    }
    return $fact;
}

上面程式以自家電腦執行發現
18! 之後以科學記號顯示
171! 之後溢位無法計算



# 使用遞迴方法 (recursive)
# 輸入 : 正整數 n
# 輸出 : 雙階乘 n!!
sub double_factorial {
    my $n = shift;

    return 'NaN' if ($n<-1);
    return 1 if ($n<2);
    return $n*double_factorial($n-2);
}

# 使用疊代方法 (iterative)
# 輸入 : 正整數 n
# 輸出 : 雙階乘 n!!
sub double_factorial_i {
    my $n = shift;
    my $fact = 1;

    return 'NaN' if ($n<-1);
    while ($n>1) {
        $fact *= $n;
        $n = $n - 2;
    }
    return $fact;
}

上面程式以自家電腦執行發現
28!! 之後以科學記號顯示
301!! 之後溢位無法計算



# 使用大數模組 (package)
# 輸入 : 正整數 n
# 輸出 : 階乘 n!
use Math::BigInt;
sub factorial_p {
    my $n = shift;

    $fact = Math::BigInt->new($n);
    return $fact->bfac();
}

# 使用大數模組 (package)
# 輸入 : 正整數 n
# 輸出 : 雙階乘 n!!
sub double_factorial_p {
    my $n = shift;
    my $fact = Math::BigInt->new(1);

    return 'NaN' if ($n<-1);
    while ($n>1) {
        $fact = $fact->bmul($n);
        $n = $n - 2;
    }
    return $fact;
}

搗蛋鬼 發表在 痞客邦 PIXNET 留言(0) 人氣()