为什么在Perl中下面的递归阶乘失败,即使它在C++和Java中工作?当阶乘递归到零时出错
爪哇:
public static long factorial(int n) {
if (n == 0) {
return 1;
} else {
return factorial(n-1) * n;
}
}
C++:
long factorial(int n) {
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
但是在Perl这一个失败(use Carp;
):
sub factorial {
my $n = shift || croak "null value for argument";
return 1 if $n == 0; # base case
return $n * factorial($n-1);
}
错误信息(第10行是在函数被调用在main()
,第16行是第二个return
声明):
null value for argument at ./fact1.pl line 14.
main::factorial(0) called at ./fact1.pl line 16
main::factorial(1) called at ./fact1.pl line 10
(以下已被编辑感谢马特·雅各布在原始版本指出我遗漏)
原来的版本,没有鲤鱼,但|| return
,该错误信息是:
Use of uninitialized value in multiplication (*) at ./fact1.pl line 16.
这是在没有命令行参数时尝试使脚本静音的结果。 (约uninitialized value
无投诉)
基本情况的一个小的修改使得它在Perl的工作太:
sub factorial {
my $n = shift || croak "null value for argument";
return 1 if $n == 1; # base case
return $n * factorial($n-1);
}
(当然,在与处理0
(零)输入废除的代价。 )
吸取的教训
- 问题是在不同的位置,我想
- Perl代码已经在部分错误,它试图这样做比C++或Java代码片断(一个非常粗糙的方法)
- 不同的错误更多消息应该给我一个提示
- 以下可帮助我的定位问题:
- 全部删除后
shift;
- 记得
0
(零)表示false
- 全部删除后
- Logical Defined-Or存在在Perl,因为5.10版本
- 至于正确的错误处理,this page提供了一个很好的概述。
为什么你不使用相同的if/else for Perl? – toolic
回复“为什么不一样if/else”:java来自一个课程示例。 (所以大括号)。 C++,我在Perl之后的测试失败了。 (但我喜欢用简单表达式的大括号)。 在Perl中,等价的“无大括号”解决方案是当条件子句最后到达时。 – Tibor
您在使用'croak'之前关于错误消息的陈述与您的问题中的代码不匹配。如果你调用'factorial()','$ n'将是'undef',并且警告将会是“数字eq中未初始化的$ n”。 (但'undef'会隐式地转换为0,并且该函数仍然会返回1.)真正的问题是:为什么要用一个undefined/null值调用函数,并期望它在Perl中工作时用其他语言工作! –