Прежде всего, вам действительно следует использовать прагмы strict
и warnings
в верхней части ваших сценариев. Ваше $n
использование особенно беспокоит. В будущем, если вы объявите переменные с my
, но будете использовать одно и то же имя, вы передадите тот факт, что они будут представлять одинаковое количество, не опасаясь, что они могут столкнуться.
В любом случае, здесь слегка отполирована, и что более важно, strict
и warnings
безопасная версия:
#!/usr/bin/env perl
use strict;
use warnings;
sub doit {
my ($n) = @_;
if( ($n - 1) % 5 ==0 ){ #if can be distributed by 5 monkey
$n = ($n - 1) * 4/5; #commit distribute
return $n;
} else {
return undef; #fail
}
}
OUTER: for my $n (0..10000){ #restriction
my $r = $n; #"recursively" find solution
for (1..5){ #assume there is 5 monkey, it can be changed
$r = doit($r);
next OUTER unless defined $r;
}
# if code gets here, then it passed 5 test, then you found the number !
print "now: $r\torigin: $n\n";
}
А теперь, если вы действительно хотите повеселиться (не используйте это в производстве, читайте в первую очередь!):
#!/usr/bin/env perl
use strict;
use warnings;
OUTER: for my $n (0..10000){
my $r = $n;
$r = ($r - 1) % 5 ? next OUTER : 4/5 * ($r - 1) for (1..5);
print "now: $r\torigin: $n\n";
}
или даже игра в гольф:
for(0..10000){$r=$n=$_;map$r*=--$r%5?next:4/5,1..5;print"now: $r\torigin: $n\n"}