【问题标题】:Perl subroutine not working in loopPerl 子程序不在循环中工作
【发布时间】:2018-08-09 05:36:08
【问题描述】:

我尝试在 Perl 中编写一个简单的代码来确定一个数字是否可以表示为质数之和。示例代码如图:

sub funcIsPrime {
    my $num = $_[0];    
    my $isPrime = 1;
    for($i= 2; $i <= $num/2; $i++){
        if($num%$i == 0){
            $isPrime = 0;
            last;
        }
    }
    return $isPrime;
}

#my $num = <>;
my $num = 20;
for($i = 2; $i <= $num/2; $i++){
    print "$i\t";
    my $j = $num-$i;
    print "$j\n";

    if(funcIsPrime($i) and funcIsPrime($j)){    # Line x
        print "$num = $i + $j\n";
    }
}

第 x 行中的函数调用语句不执行。放在循环之外的同一行工作正常。可能的解决方案是什么?请帮忙。谢谢。

【问题讨论】:

  • Re "第 x 行的函数调用语句不执行。",这很容易通过在funcIsPrime 中添加warn("!"); 来反驳。你到底有什么问题?
  • 始终使用use strict; use warnings qw( all );

标签: perl loops subroutine


【解决方案1】:

主要问题是变量声明中缺少my。如果你包含use warnings;use strict;,Perl 不会让你运行程序:

Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at test.pl line 22.
Execution of test.pl aborted due to compilation errors.

这是简化的工作代码(顺便说一下,您可以搜索高达 n 的平方根的因子,尽管这无论如何都不是一个完美或有效的素数测试):

use strict;
use warnings;

sub isPrime {
    my $num = $_[0];    

    for (my $i = int sqrt $num; $i > 1; $i--) {
        if ($num % $i == 0) {
            return 0;
        }
    }

    return 1;
}

my $num = 20;

for (my $i = 2; $i <= $num / 2; $i++) {
    my $j = $num - $i;

    if (isPrime($i) && isPrime($j)) {
        print "$num = $i + $j\n";
    }
}

输出

20 = 3 + 17
20 = 7 + 13

【讨论】:

  • 您的意思是:my $i = int sqrt($num)
  • 由于浮点错误,int sqrt $num 可以给你一个比你期望的少的数字,所以my $i = 1 + int sqrt $num 会更安全。
  • 非常感谢。有效。我找到了我出错的地方。
  • @ikegami 我认为——我用我的 sub 解决了PE #7 作为基本测试,它是准确的。你有一个输入失败的例子吗?如果是这样,我会改变它。我可以看到我可能应该让它与 OP 一样,而不是试图进入优化虫洞 :)
  • @ggorlen,我的数学库似乎非常聪明,并且返回精确的整数——不是高于或低于十亿分之一——对于整数 n=1..100 的 sqrt(n^2)。没有说其他数学库那么聪明。虽然
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多