in reply to map & arrays & recursion

The literal equivalent of your mapped case would be:

sub traversal { my $self = shift; my @nodes; # self is FIRST @nodes = ( $self ); for (@{ $self->{children} }) { push @nodes, $_->traversal( ); } return @nodes; }

Note how you are pushing on the result of $_->traversal( );. Your second code could equivalently be written as

sub traversal { my $self = shift; my @nodes; # self is FIRST @nodes = ( $self ); push @nodes, @{ $self->{children} }; $_->traversal() for @{ $self->{children} }; return @nodes; }

Without knowing the contents of $self->{children} or the side-effects/return values of $node->traversal(), I cannot provide any additional insight.

Replies are listed 'Best First'.
Re^2: map & arrays & recursion
by ikegami (Patriarch) on Oct 01, 2010 at 03:13 UTC

    Without knowing the contents of $self->{children} or the side-effects/return values of $node->traversal()

    Presumably, traversal traverses a tree. The children of a node are likely of the same type as that node, which makes traversal a recursive function.

    I cannot provide any additional insight.

    The OP's first snippet returns the nodes of the tree in pre-order.

    The OP's second snippet is obviously broken, traversing the entire tree to get only the nodes of depth one and two.

      thanks to both kennethk and ikegami.

      the first code from kennethk does indeed work. so i guess i don't understand what routines that return an array really do......

      given this snippet :

      foreach my $node ( @{ $self->{_children} } ) { push @list, $node->traverse(); } return @list;

      is the following a correct description ?

      foreach node in the children ARRAY recursively call this routine if the node has children recursively call this routine if the node has NO children the returned list is just that node each time the routine returns it's array is pushed onto the array of the callee when the routine reaches the end of the top children ARRAY the visited nodes haved all been pushed into the top list

      for some reason, i had the impression that if you push an ARRAY into an ARRAY, the ARRAYS are preserved (not merged).

      thanks for your patience and support

        is the following a correct description ?

        • You described an algorithm with three conditionals and a loop. The algorithm only has a loop.
        • You described an algorithm with two recursive calls. The algorithm only has one.
        • You described an algorithm with an infinite loop.
        • You described an algorithm that adds to the callee's array after the callee has returned. That's impossible.

        The algorithm is:

        • Given the root of a subtree $self,
          • $self is a node of subtree $self.
          • For every child of $self,
            • The nodes in the subtree rooted at that child is a node of subtree $self.
          • Return the nodes of subtree $self.

        i had the impression that if you push an ARRAY into an ARRAY, the ARRAYS are preserved (not merged).

        It sounds like you're expecting an array to be able to contain another array. It can't, at least not directly. Array elements are scalars.