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

Har*_*ens 3 recursion perl

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

要按预先检索所有节点,我可以将以下子例程添加到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;
}
Run Code Online (Sandbox Code Playgroud)

sub必须像这样使用:

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

#then later...
my @nodes_in_preorder;
$btree->pre_order(\@nodes_in_preorder);
Run Code Online (Sandbox Code Playgroud)

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

my @nodes_in_preorder = $btree->pre_order();
Run Code Online (Sandbox Code Playgroud)

为了能够做的事情

for ($btree->pre_order()) { #bla bla } 
Run Code Online (Sandbox Code Playgroud)

稍后的.

这有意义吗,还是我迂腐?

mob*_*mob 9

怎么样:

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