2010-04-29 2 views
2

PHP를 배우고 있습니다. 이 코드가 왜 작동하지 않는지 이해하는 데 문제가 있습니다.while 루프에서 array_sum() 사용

특히 : array_sum ($ x) (1596)의 결과가 $ cap보다 큰 이유는 무엇입니까? 아마 while 루프의 본질을 이해하지 못 하겠지만 (print_r ($ x)를 보면서) 실제로 그렇게하기 전에 루프가 단계를 잘라야합니다.

<?php 

function fibonacci_sum($cap = 1000){ 

list($cur, $nxt, $seq) = array(0, 1, array()); 

while (array_sum($seq) < $cap) { 

$seq[] = $cur;  
$add = $cur + $nxt; 
$cur = $nxt; 
$nxt = $add; 
} 

return $seq; 

} 

$x = fibonacci_sum(); 
echo array_sum($x); 

?> 

모든 의견에 감사드립니다.

베스트

, 매트

답변

0

합 while 루프의 몸체가 입력 미만 cap 지난 시간이다. 이것이 모든 주요 언어에서 while 루프가 작동하는 방식입니다. 이 경우 루프가 마지막으로 종료 될 때 합계는 cap보다 큽니다.

2

이렇게 보면 : array_sum($x)$cap보다 작 으면 while 루프의 본문이 다시 실행됩니다. 따라서 while 루프가 실행을 중지하면 정의에 따라 while 상단의 조건이 false가됩니다. (*) 나는 당신이 말하고 싶은 생각 : 당신이 $cap을 초과

while (array_sum($seq) + $cur < $cap) { 
중지됩니다

단지 전에 어떤 당신이 원하는 것 것입니다.

(*) 그래, 그래, break 진술에 대한 면책 ​​조항.

+0

감사합니다. Daniel. – m477

2

간단한 실행 순서.

는 약간의 변수 감시자를 추가 할 경우 당신이 실행하는 경우는이

while (array_sum($seq) < $cap) 
    { 
    echo $cur, ' : ', array_sum($seq), '<br>'; 
    $seq[] = $cur; 
    $add = $cur + $nxt; 
    $cur = $nxt; 
    $nxt = $add; 
    } 

을 발생하는 방법을 쉽게 알 수 마지막 출력은 610 : 986을 보여줍니다. 따라서 986은 1000보다 작아 루프의 반복이 실행되지만 루프의 맨 처음 줄은 $cur$seq에 푸시합니다. 즉, 캡보다 합계 크리에이터를 만들었다는 것을 완전히 잊어 버렸습니다. 당신은 함수 외부 array_sum()을 할 때, 그 (610)는 배열 합 을 더한 다음 값 캡보다 작은 경우 따라서 1596

그래서 당신이 정말로 원하는 것은 그것의 일부입니다.

while (array_sum($seq) + $cur < $cap) 

그러나 함수가 배열을 전혀 반환하지 않는 것은 약간 이상합니다. 합계를 직접 반환하지 않는 이유는 무엇입니까?

+0

감사합니다 피터, 그 말이 완벽합니다. 선명도를 높이 평가하십시오. 그리고 여러분은 맞습니다. 결국 함수는 단지 합계를 반환해야합니다. – m477