2012-01-19 38 views
-1

我不能讓這個腳本循環5次,並通過遞歸()方法循環後停止。 $ x的值始終爲1,而第二個值永遠不會達到。任何人都可以幫我理解這個嗎?PHP迴路方法

在此先感謝!

public function recursion(){  

    $a = 0;   

    do{ 
     $a++;  

     echo "$a \n"; 
     sleep(1); 
     echo date('h:i:s') . "\n"; 
    }while($a < 5); 

    $x++; 
    echo "** $x **\n"; 

    while($x <= 5){ 
     echo "Going back to my method $x times \n"; 
     $this->recursion(); // I'd like to loop this method X times 
     } 
} 

回答

1

既然你不及格$x遞歸之間,$x當您試圖增加它是不確定的。

在你的函數的開頭添加static $x = 0;

0

您不保留$x的狀態。你可以將其作爲類的成員,並與$this->x引用它。

+0

嘿,夥計們,非常感謝!這真的幫助我更好地理解這個問題。 – rpa

0

爲什麼不分配類變量或其他東西來跟蹤$ x,而不是假定它在整個遞歸過程中都保持可用?

private $x; 
public function recursion(){  

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 

     $this->x ++; 
     echo "** $this->x **\n"; 

     while($this->x <= 5){ 
      echo "Going back to my method $this->x times \n"; 
      $this->recursion(); // I'd like to loop this method X times 
      } 
    } 
0

您聲明的變量($ x)對於recursion方法的每個實例都是私有的。所以,你對他們所做的任何改變,都不會延續到下一個電話。
因爲我認爲你是一個對象的內部,使物體的那些成員變量,thuse從方法到對象改變其範圍。而且,由於對recursion所有電話都是同一個對象的範圍內,該值將結轉:

private $x=0; 
public function recursion(){  

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 

     $this->x++; 
     echo "** {$this->x} **\n"; 

     while($this->x <= 5){ 
      echo "Going back to my method {$this->x} times \n"; 
      $this->recursion(); // I'd like to loop this method X times 
      } 
    } 
0

的方法中的$x是一個局部變量。 所以每次調用recursion()時間,該$x是一個完整的新的。所以$x++後,它將擁有價值1

private $x = 0; 
public function recursion(){  

    $a = 0;   

    do{ 
     $a++;  

     echo "$a \n"; 
     sleep(1); 
     echo date('h:i:s') . "\n"; 
    }while($a < 5); 

    $this->x++; 
    echo "** {$this->x} **\n"; 

    while($this->x <= 5){ 
     echo "Going back to my method $this->x times \n"; 
     $this->recursion(); // I'd like to loop this method X times 
    } 
} 

順便說一下,因爲它是一個尾遞歸。它總是可以減少到一個循環。喜歡的東西:

public function loop(){  
    for($x = 1; $x <= 5; $x++){ 
     echo "** {$x} **\n"; 

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 
    } 
} 

無論如何,如果你有自己的理由。前進。

+0

有趣的選擇。我會盡量使它適應我的問題。謝謝 – rpa