gpt4 book ai didi

perl:为什么不返回案例 0 或 1?

转载 作者:行者123 更新时间:2023-12-02 08:38:11 24 4
gpt4 key购买 nike

我正在用哈希表实现一个 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 来输入它就不起作用?

最佳答案

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

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

编辑:问题是什么

  • 对于任何输入,defined 测试总是会失败,因为字符串 number\n 不存在于散列中

  • Perl 能够对您的输入 20\n - 1 执行数学运算是 19

  • 现在 01 找不到定义的值,您的代码将调用 fib(-1)fib(-2)fib(0)fib(-1)。这将产生无限循环。

  • 使用 2 测试将失败,Perl 将执行减法调用 fib(1) + fib(0)(没有 \n )。在第二次调用中,您的测试将工作,因为 $m_fib(0) 确实存在。

编辑2

有一些评论的小评论

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

  • 一些其他内嵌注释(您可以使用 Perl::Critic 查看您的代码)

    #!/usr/bin/perl

    use strict;
    use warnings;

    # Not needed
    # no warnings 'recursion';

    my %m_fib = ( 0, 1, 1, 1 );

    # From Perl::Critic
    #
    # Use "<>" or "<ARGV>" or a prompting module instead of "<STDIN>" at line 10, column 17.
    # InputOutput::ProhibitExplicitStdin (Severity: 4)
    # Perl has a useful magic filehandle called `*ARGV' that checks the
    # command line and if there are any arguments, opens and reads those as
    # files. If there are no arguments, `*ARGV' behaves like `*STDIN' instead.
    # This behavior is almost always what you want if you want to create a
    # program that reads from `STDIN'. This is often written in one of the
    # following two equivalent forms:
    #
    # while (<ARGV>) {
    # # ... do something with each input line ...
    # }
    # # or, equivalently:
    # while (<>) {
    # # ... do something with each input line ...
    # }
    #
    # If you want to prompt for user input, try special purpose modules like
    # IO::Prompt.

    while ( my $a = <> ) {
    chomp $a;

    # use " just when needed
    print '--' . fib($a) . "\n";
    }

    sub fib {

    my $i = shift;

    if ( not defined $m_fib{$i} ) {

    # it is not necessary to use & for subroutine calls and
    # can be confused with the logical and

    $m_fib{$i} = fib( $i - 1 ) + fib( $i - 2 );
    }
    return $m_fib{$i};

    }

关于perl:为什么不返回案例 0 或 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19173899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com