2012-01-19 4 views
-1

이 스크립트 루프를 5 회 만들 수 없으며 recursion() 메소드를 반복 한 후 중지 할 수 없습니다. $ 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 메소드의 각 인스턴스에 대해 비공개입니다. 그래서, 당신이 그들에게하는 모든 변화는 다음 호출로 이어지지 않습니다.
나는 당신이 객체 안에 있다고 가정하기 때문에, 객체의 변수를 메쏘드로 변경하여 객체의 범위를 메쏘드에서 객체로 바꾼다. 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