Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
13
Task/Ackermann-function/Perl/ackermann-function-1.pl
Normal file
13
Task/Ackermann-function/Perl/ackermann-function-1.pl
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
my @memo;
|
||||
sub A {
|
||||
my( $m, $n ) = @_;
|
||||
$memo[ $m ][ $n ] and return $memo[ $m ][ $n ];
|
||||
$m or return $n + 1;
|
||||
return $memo[ $m ][ $n ] = (
|
||||
$n
|
||||
? A( $m - 1, A( $m, $n - 1 ) )
|
||||
: A( $m - 1, 1 )
|
||||
);
|
||||
}
|
||||
}
|
||||
6
Task/Ackermann-function/Perl/ackermann-function-2.pl
Normal file
6
Task/Ackermann-function/Perl/ackermann-function-2.pl
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
sub A {
|
||||
my ($m, $n) = @_;
|
||||
if ($m == 0) { $n + 1 }
|
||||
elsif ($n == 0) { A($m - 1, 1) }
|
||||
else { A($m - 1, A($m, $n - 1)) }
|
||||
}
|
||||
6
Task/Ackermann-function/Perl/ackermann-function-3.pl
Normal file
6
Task/Ackermann-function/Perl/ackermann-function-3.pl
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
sub A {
|
||||
my ($m, $n) = @_;
|
||||
$m == 0 ? $n + 1 :
|
||||
$n == 0 ? A($m - 1, 1) :
|
||||
A($m - 1, A($m, $n - 1))
|
||||
}
|
||||
15
Task/Ackermann-function/Perl/ackermann-function-4.pl
Normal file
15
Task/Ackermann-function/Perl/ackermann-function-4.pl
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
use Memoize; memoize('ack2');
|
||||
use bigint try=>"GMP";
|
||||
|
||||
sub ack2 {
|
||||
my ($m, $n) = @_;
|
||||
$m == 0 ? $n + 1 :
|
||||
$m == 1 ? $n + 2 :
|
||||
$m == 2 ? 2*$n + 3 :
|
||||
$m == 3 ? 8 * (2**$n - 1) + 5 :
|
||||
$n == 0 ? ack2($m-1, 1)
|
||||
: ack2($m-1, ack2($m, $n-1));
|
||||
}
|
||||
print "ack2(3,4) is ", ack2(3,4), "\n";
|
||||
print "ack2(4,1) is ", ack2(4,1), "\n";
|
||||
print "ack2(4,2) has ", length(ack2(4,2)), " digits\n";
|
||||
34
Task/Ackermann-function/Perl/ackermann-function-5.pl
Normal file
34
Task/Ackermann-function/Perl/ackermann-function-5.pl
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
use strict;
|
||||
use warnings;
|
||||
use Math::BigInt;
|
||||
|
||||
use constant two => Math::BigInt->new(2);
|
||||
|
||||
sub ack {
|
||||
my $n = pop;
|
||||
while( @_ ) {
|
||||
my $m = pop;
|
||||
if( $m > 3 ) {
|
||||
push @_, (--$m) x $n;
|
||||
push @_, reverse 3 .. --$m;
|
||||
$n = 13;
|
||||
} elsif( $m == 3 ) {
|
||||
if( $n < 29 ) {
|
||||
$n = ( 1 << ( $n + 3 ) ) - 3;
|
||||
} else {
|
||||
$n = two ** ( $n + 3 ) - 3;
|
||||
}
|
||||
} elsif( $m == 2 ) {
|
||||
$n = 2 * $n + 3;
|
||||
} elsif( $m >= 0 ) {
|
||||
$n = $n + $m + 1;
|
||||
} else {
|
||||
die "negative m!";
|
||||
}
|
||||
}
|
||||
$n;
|
||||
}
|
||||
|
||||
print "ack(3,4) is ", ack(3,4), "\n";
|
||||
print "ack(4,1) is ", ack(4,1), "\n";
|
||||
print "ack(4,2) has ", length(ack(4,2)), " digits\n";
|
||||
Loading…
Add table
Add a link
Reference in a new issue