2009-08-14 6 views
0

PHP에서 오일러 문제를 해결하고 있습니다. 내가 주로 핥았 문제가PHP의 재귀 함수에 원래 인수를 저장하려면 어떻게해야합니까?

<?php 
$biggest = 0; 
$counter = 1; 
function test($i){ 
    global $biggest; 
    global $counter; 
    if ($i == 1) { 
     echo "I'm done! Took me $biggest steps"; 
    } 
    else { 
     if ($i%2 == 0) { 
      $counter = $counter + 1; 
      if ($counter>$biggest) { 
       $biggest = $counter; 
      } 
      test($i/2); 
     } 
     else { 
      $counter = $counter + 1; 
      if ($counter>$biggest) { 
       $biggest = $counter; 
      } 
      test(3*$i+1); 
     } 
    } 
} 

test(13); 
?> 

,하지만 난 다시 원래의 입력에서 얻을 수없는 것 : 지금까지이 기능을 가지고있다. 질문은 "숫자가 있으면 홀수이면 3n + 1을 얻고, 짝수이면 n/2를 얻습니다. 1을 반환 할 때까지 않습니다. 시작하기 전에 어떤 시작 값이 가장 많은"걸음 "을 얻는가?" 나는 현재 단계 수를 반환하고 있지만 재귀하는 동안 $ i를 계속 재설정하므로 시작 단계에서 가장 많은 단계를 산출 할 수는 없습니다.

이 번호를 추적 할 수는 있지만 루프의 다음 인스턴스에서 어떻게 파괴되지는 않습니까? (나는 결국 이것을 $ i = 1, $ i < 1000000, $ i ++ 루프로 포장 할 것이다)

고마워!

답변

2

일반적인 방법은, 각 시간을 통해 원래의 인수를 전달하는 것입니다. 프리미티브 (그리고 거의 전적으로 무관 한 예제) :

<?php 

function fact($n) { 
    if($n == 1) return 1; 
    else return $n * fact($n - 1); 
} 

?>

이것은 PHP의 팩토리얼 함수의 매우 기본적인 구현입니다. 이제 마지막 단계에서 사용할 수있는 초기 값을 가지고 어떤 이유에서 원하는 말 : 당신이 memory_fact($n, $initial)처럼 뭔가를 부를 것이다 래퍼 함수 fact($n)을 구축 할 것 :이 시작된 곳

<?php 

function fact($n) { 
    return memory_fact($n, $n); 
} 

function memory_fact($n, $initial) { 
    if($n == 1) return 1; 
    else return $n * memory_fact($n - 1, $initial); 
} 

?>

이 방법은, memory_fact 항상 알고있다.

0

매개 변수로 전달하기가 쉽습니다. 다음은 몇 가지 파이썬 틱 의사 코드는 다음과 같습니다 당신이 당신의 기본 케이스에 도착하면 결국, 당신은 여전히 ​​가능한 있도록

def func(start, arg): 
    if foo(arg): 
     return func(start, arg+1) 
    else: 
     return [start, arg] 
0

전역 변수가 필요하지 않습니다. 세계는 악합니다. 유용한 정보를 test()에서 반환 해보세요. 또한 위에서위의 폐기물을 여러 번 발견 할 수 있습니다. memoization을 사용해보세요. 여기

는 산출 피보나치 수열하는 메모이 제이션 예이다 :

있다 (O (로그 n) 시간 포함) 피보나치 수를 처리하기 위해 다른 시간 efficent 일정한 공간 접근법 있지만하는 것으로
function fib($n) { 
    static $data = array(1, 1); 
    if (!isset($data[$n])) { 
     $data[$n] = fib($n-1) + fib($n-2); 
    } 
    return $data[$n]; 
} 

Collatz 추측은 좀 더 까다 롭습니다.

+1

함수의 통계는 전역 변수보다 우수하지 않습니다. – jason

관련 문제