我正在使用哈希表实现perl fib:
#!/usr/bin/perl
use strict;
use warnings;
no warnings 'recursion';
my %m_fib = (0,1,1,1);
while (my $a = <STDIN>) {
print "--".&fib($a)."\n";
}
sub fib {
foreach my $i (@_) {
if (not defined $m_fib{$i}) {
$m_fib{$i} = &fib($i - 1) + &fib($i - 2);
}
return $m_fib{$i};
}
}
大于1的输入效果很好,但是0或1都是静音。
哈希应该没问题,因为它返回了正确的结果,但是如果我用0或1提供它,为什么它不起作用?
答案 0 :(得分:6)
您的输入包含行尾(\n
)。使用chomp
(documentation)
while (my $a = <STDIN>) {
chomp $a;
print "--".&fib($a)."\n";
}
修改:问题是什么
对于任何输入,defined
测试将始终失败,因为哈希中不存在字符串number\n
Perl能够在您的输入20\n - 1
为19
现在0
或1
找不到定义的值,您的代码将调用fib(-1)
和fib(-2)
或fib(0)
和{{1 }} 分别。这将产生无限循环。
2,测试将失败,Perl将执行减法调用fib(-1)
(不 fib(1) + fib(0)
)。在第二次调用中,您的测试将在\n
确实存在时起作用。
修改2
带有一些评论的小评论
您的函数处理多个参数但在第一个参数之后退出。你永远不会用多个参数调用它(即使你做了它也永远不会处理第二个参数)
内联其他一些评论(您可以使用Perl::Critic审核您的代码)
$m_fib(0)