盂兰盆,
我有这个代码,这是一个简单的循环,它可以...调用它你需要发送一个数字数组的引用。
@blah = (0b0010,0b010,0b0111);
$ans = &logical_loop(\@blah);
sub logical_loop()
{
my $codes = $_[0];
my $ans = 0;
foreach (@$codes) {
printf "%b\n",$_;
$ans = ($ans | $_)
}
return($ans);
}
我想让它递归,所以我写了这个代码不起作用....请有人能告诉我我错过了什么吗?可能与变量范围有关吗?
sub recursive_loop
{
my $codes = $_[0];
my $el = shift @$codes;
if (@$codes == ()) {
return ($el | $answer);
} else {
$answer = (&recursive_loop(\@$codes) | $el);
}
}
答案 0 :(得分:1)
我看到你的子程序有一些问题。
答案 1 :(得分:1)
sub recursive_loop {
return 0 unless @_;
my $head = shift;
return $head | recursive_loop(@_);
}
@blah = (0b0010,0b010,0b0111);
recursive_loop(@blah);
更高效的尾递归:
sub or_it_up {
unshift @_, 0;
goto &recursive_loop;
}
sub recursive_loop {
my $ans = shift;
return $ans unless @_;
unshift @_, $ans | shift;
goto &recursive_loop;
}
@blah = (0b0010,0b010,0b0111);
or_it_up(@blah);
你可以使用调用recursive_loop作为函数,但这样就不会产生堆栈帧。
您也可以在没有or_it_up
的情况下编写它,仅用于教育目的。直接调用recursive_loop
将导致由二进制或。的性质引起的结果。