perl:为什么不回归0或1?

时间:2013-10-04 05:26:36

标签: perl

我正在使用哈希表实现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提供它,为什么它不起作用?

1 个答案:

答案 0 :(得分:6)

您的输入包含行尾(\n)。使用chompdocumentation

将其删除
while (my $a = <STDIN>) {
    chomp $a;
    print "--".&fib($a)."\n";
}

修改:问题是什么

  • 对于任何输入,defined测试将始终失败,因为哈希中不存在字符串number\n

  • Perl能够在您的输入20\n - 119

  • 的情况下执行数学运算
  • 现在01找不到定义的值,您的代码将调用fib(-1)fib(-2)fib(0)和{{1 }} 分别。这将产生无限循环。

  • 2,测试将失败,Perl将执行减法调用fib(-1) fib(1) + fib(0))。在第二次调用中,您的测试将在\n确实存在时起作用。

修改2

带有一些评论的小评论

  • 您的函数处理多个参数但在第一个参数之后退出。你永远不会用多个参数调用它(即使你做了它也永远不会处理第二个参数)

  • 内联其他一些评论(您可以使用Perl::Critic审核您的代码)

    $m_fib(0)
相关问题