使用PERL实现迭代递归

使用PERL实现迭代递归,perl,recursion,Perl,Recursion,好极了 我有这段代码,它是一个简单的循环,可以工作…要调用它,需要向它发送一个数字数组的引用 @blah = (0b0010,0b010,0b0111); $ans = &logical_loop(\@blah); sub logical_loop() { my $codes = $_[0]; my $ans = 0; foreach (@$codes) { printf "%b\n",$_; $ans = ($ans | $_)

好极了

我有这段代码,它是一个简单的循环,可以工作…要调用它,需要向它发送一个数字数组的引用

@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);
    }
}

我发现你的子程序有一些问题

  • 其名称包含一个间距标记
  • 它不调用自身,因此不可能递归
更高效的尾部递归:

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);
您可以使用调用递归_循环作为函数,但以这种方式,它不会生成堆栈帧


您也可以简单地编写它,而不必使用
或_it _up
,这只是出于教育目的。直接调用
recursive\u loop
将产生由二进制或二进制性质引起的结果。

对于递归函数,您必须调用函数
recursive\u loop
(在其名称中添加下划线)。谢谢;我在发布代码后编辑了它;纠正了那些错误
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);