2011-09-17 4 views
1

난 그냥 PHP에서 일부 재귀 연습을하고 그리고 난 다음의 출력에 의해 당황 조금 있어요 : 나는 가정 한 것이다 그것을 실행하기 전에이 PHP 스 니펫은 왜 이런 식으로 동작합니까?

function calc($numTimes, $i, $total) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     calc($numTimes, $i, $total); 
    } 
    echo $total.'+'.$i.'<br />'; 
} 
calc(5); 

출력 할 수 32 + 6. 그러나 이것이 내가 얻은 것입니다.

32+6 
32+6 
16+5 
8+4 
4+3 
2+2 

나는 그것을 얻지 못합니다. 출력은 내가 기대했던 것보다 5 줄 길뿐 아니라 총을 증가시키는 대신 제거하는 것입니다. 또한, 내가 휴식을 추가하는 경우; 에코 이후에는 32 + 6 만 반환됩니다. 그러나 코드를 변경하여 return $ total을 사용합니다. 대신 에코의 :

function calc($numTimes, $i, $total) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     calc($numTimes, $i, $total); 
    } 
    return $total.'+'.$i.'<br />'; 
} 
$r = calc(5); 
echo $r; 

이 인쇄됩니다 것입니다 :

2+2 

나는 조금 혼란 스러워요과 희망 누군가가 나를 여기에 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다.

+0

무엇이'$ sum'입니까? 너 뭐하려고? 코드가 손상된 경우 어떻게해야합니까? –

답변

4

당신은 재귀 호출로 아무 것도하지 않습니다. 라인 :

calc($numTimes, $i, $total); 

가 값을 calculcate하지만, 그것으로 아무것도하지 않습니다 수 있습니다. 반환 된 값은 절대로 저장되지 않습니다.

$res = calc($numTimes, $i, $total); 

을 다음

내가 무엇을 의미하는 것은 생각 $ 고해상도로 계속 : 당신은 그것을 가져올 것이다

첫 번째 예에서
function calc($numTimes, $i = 0, $total = 0) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     return calc($numTimes, $i, $total); 
    } 
    return $total.'+'.$i.'<br />'; 
} 
echo calc(5); 
+0

@ dfsq updated;) – galchen

+0

이것은 효과가있는 값만 반환합니다. 나는 총계가 계속 감소하는 이유를 알고 싶어합니다. 기본값을 정의하는 팁을 주셔서 감사합니다. – Freyr

+0

$ total을 호출로 보내면 변수를 보내지 않고 변수의 값을 보냅니다. $ total로 변경하면 바깥 범위에 영향을 미치지 않습니다. 새로운 "$ total"이 각각의 재귀 호출마다 생성 될 것입니다. – galchen

0

, calc() 조건부 자체 내에서 호출됩니다 , 따라서 그것은 반복적이며 수많은 결과를 출력합니다 (5 회의 에코 호출).

두 번째 예에서는 반환 값이 calc() 인 결과가되도록 변수를 설정했습니다. 여전히 루핑되지만 결과는 매번 재정의됩니다. 따라서 한 결과가 표시됩니다 (에코는 한 번 호출됩니다).

0

첫 번째 if 절에 $total 대신 $sum을 입력하면 오타가 생깁니다.

관련 문제