使用PERL进行迭代递归

时间:2013-12-05 08:29:35

标签: 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 | $_)
    }
    return($ans);
}

我想让它递归,所以我写了这个代码不起作用....请有人能告诉我我错过了什么吗?可能与变量范围有关吗?

sub recursive_loop 
{
    my $codes = $_[0];
    my $el = shift @$codes;
    if (@$codes == ()) {
        return ($el | $answer);
    } else {
        $answer = (&recursive_loop(\@$codes) | $el);
    }
}

2 个答案:

答案 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将导致由二进制或。的性质引起的结果。