perl - 在 perl 中重写递归函数,以便它可以在列表上下文中使用

标签 perl recursion

考虑 Moose::Cookbook::Basics::Recipe3 中开发的二叉树

检索所有节点in preorder ,我可以将以下子程序添加到 BinaryTree 包中

sub pre_order {
  my ($self,$aref) = @_;

  push @$aref, $self->node;

  pre_order($self->left,$aref) if $self->has_left;
  pre_order($self->right,$aref) if $self->has_right;
}

子必须像这样使用:

my $btree = BinaryTree->new;
#add some nodes

#then later...
my @nodes_in_preorder;
$btree->pre_order(\@nodes_in_preorder);

我将如何更改子例程才能使用如下语法:

my @nodes_in_preorder = $btree->pre_order();

为了能够做类似的事情

for ($btree->pre_order()) { #bla bla } 

稍后。

这是有道理的,还是我很迂腐?

最佳答案

怎么样:

sub pre_order {
  my $self = shift;
  return ($self->node,
    $self->has_left ? $self->left->pre_order : (),
    $self->has_right ? $self->right->pre_order : ());
}

关于perl - 在 perl 中重写递归函数,以便它可以在列表上下文中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250365/

相关文章:

javascript - 使用 JS/Coffeescript 递归连接数组

python - 使用Python创建递归拓扑树

java - 递归定义中的堆栈溢出错误

c - 在带有 while 循环的 C 中使用递归函数的阶乘程序 c

perl - 如何使用 mod_perl 发送自定义 http 状态代码

perl - "use warnings"可以只在一个子程序中吗?

c - 将函数参数分配给C中的局部静态变量,并在递归中保留第一个值

perl - 需要将 Perl 解包转换为 Inline::C AV*

perl - 如何创建哈希的递归哈希? (无限深)

linux - Perl - 基本的 STDIN 问题