I dont get the order of execution

Sorry, i am posting this question a second time. The first was not well arranged and i can’t find a way to delete it.
By my previous understanding, due to the order of execution of recursive functions, when it is called it does not go on to execute the remaining part of the code but creates a new instance of the function in memory, the execution of the rest part of the function occurs at the last instance when the base case is fulfilled. In that light the code snippet
// call display on each of this node’s children
// note a node will only have children in its list if expanded
$num_children = sizeof($this->m_childlist);
for($i = 0; $i<$num_children; $i++)
$row = $this->m_childlist[$i]->display($row, $sublist);
return $row;
will create several instances of the display() function which display the tree, but only return $row at last instance which is in turn returns $row to the instance that calls it until it get to the first. But the writer of the book says the snippet of code sends $row from one call to the next and then the next. How is this possible when the return of $row occurs after the call to the recursive function. What am I getting wrong?
The entire class code is shown below

<?php // functions for loading, contructing and // displaying the tree are in this file class treenode { // each node in the tree has member variables containing // all the data for a post except the body of the message var $m_postid; var $m_title; var $m_poster; var $m_posted; var $m_children; var $m_childlist; var $m_depth; function treenode($postid, $title, $poster, $posted, $children, $expand, $depth, $expanded, $sublist) { // the constructor sets up the member variables, but more // importantly recursively creates lower parts of the tree $this->m_postid = $postid; $this->m_title = $title; $this->m_poster = $poster; $this->m_posted = $posted; $this->m_children =$children; $this->m_childlist = array(); $this->m_depth = $depth; // we only care what is below this node if it // has children and is marked to be expanded // sublists are always expanded if(($sublist||$expand) && $children) { $conn = db_connect(); $query = "select * from header where parent = $postid order by posted"; $result = mysql_query($query); for ($count=0; $row = @mysql_fetch_array($result); $count++) { if($sublist||$expanded[ $row['postid'] ] == true) $expand = true; else $expand = false; $this->m_childlist[$count]= new treenode($row['postid'],$row['title'], $row['poster'],$row['posted'], $row['children'], $expand, $depth+1, $expanded, $sublist); } } } function display($row, $sublist = false) { // as this is an object, it is responsible for displaying itself // $row tells us what row of the display we are up to // so we know what color it should be // $sublist tells us whether we are on the main page // or the message page. Message pages should have // $sublist = true. // On a sublist, all messages are expanded and there are // no "+" or "-" symbols. // if this is the empty root node skip displaying if($this->m_depth>-1) { //color alternate rows echo ''; else echo '#ffffff">'; // indent replies to the depth of nesting for($i = 0; $i<$this->m_depth; $i++) { echo ''; } // display + or - or a spacer if ( !$sublist && $this->m_children && sizeof($this->m_childlist)) // we're on the main page, have some children, and they're expanded { // we are expanded - offer button to collapse echo 'Collapse Thread'; } else if(!$sublist && $this->m_children) { // we are collapsed - offer button to expand echo 'Expand Thread'; } else { // we have no children, or are in a sublist, do not give button echo ''; } echo " m_postid >m_postid'>$this->m_title - $this->m_poster - ".reformat_date($this->m_posted).''; echo ''; // increment row counter to alternate colors $row++; } // call display on each of this node's children // note a node will only have children in its list if expanded $num_children = sizeof($this->m_childlist); for($i = 0; $i<$num_children; $i++) { $row = $this->m_childlist[$i]->display($row, $sublist); } return $row; } }; ?>[/php]

Well, each “instance” of the routine is executed in order. Therefore, changes to $row is done orderly.
Any variables inside the routine are handled in order of the called routine. Therefore, each recursion of
the routine is handled in order. This is nothing like “thread” handling, just a set calling order, one after
another. Read all of the sites I mentioned in the other post. They may help you understand better.

Thanks Ernie. My problem is the “return $row” that occurs after the call to the recursive function

  1. Is this part of the code executed in each instance of the function, thus returning the value of the row to $row.
  2. If it executes each times, is it not against the structure of recursive functions; Normally, the part before the call to the recursive function is executed first for all instances, then since the base case fails in the last instance, the rest part is executed for each instance until control is returned to the first calling function.
  3. If it’s not executed each time then when.

Please a little further help will be appreciated.

Sponsor our Newsletter | Privacy Policy | Terms of Service