2015-01-06 3 views
-1

나의 수학 교육은 미적분을 통해서만 확장되며, 나 자신이 재귀없이 조각 별 재귀 함수를 하나의 것으로 변환하고자하는 것을 발견했습니다. 패턴을 찾는 것과 비슷한 무력에 의존하지 않고 이것을 할 수있는 방법이 있습니까? (전혀에도 가능한가?)조각 별 재귀 함수를 비 재귀 함수로 변환 하시겠습니까?

즉, 함수는 (모든 정수에 대해)
F (0) 1
F (1) = 1
F (2) = 2
를 = (2n + 1) = f (n-1) + f (n) + 1 (n (n)에 대해) f (2n) + f > = 1)

나는 this similar question을 알고 있지만 행렬에 관련된 대답은 나를 넘어선 다. 지식이 부족한 설명이 있다면 크게 감사하겠습니다.

+2

이 질문은 주제에서 벗어난 것으로 보인다 :이 저장소로 큐를 사용하여 델파이로 작성 비 재귀 (반복) 함수의 예입니다. –

+0

'2n'은 당신이 링크 한 질문보다 이것을 어렵게 만듭니다. 이 질문이 math.se로 옮겨지면 더 나은 행운을 누릴 수 있습니다. – Teepeemm

+0

당신의 재발 관계는 당신이 링크 한 게시물의 것보다 훨씬 더 복잡합니다. 우선, 요소의 정의는 이전 요소에 의존하지 않고 'n/2'에 의존하므로 동일한 종류의 행렬로 동일한 반복을 표현할 수 없습니다. 그런 다음, 짝수와 홀수 모두에 사용되는 단일 수식 대신 두 가지 수식이 있습니다. 마지막으로 2 개의 연속 요소에 대한 정의는 {2n-1,2n} 대신 {2n-1,2n} 또는 {2n + 1,2n + 2}를 사용하는 경우에도 'n/2' , 2n + 1} '). – Cimbali

답변

0

편집 :
귀하의 의견에 따르면, 당신은 아마도 빠른 해결책을 필요로하지 않을 것입니다. 재귀 트리의 크기를 확인했습니다 - 놀랍도록 작은 - 10^18 (대략 -재귀 수준, i 번째 수준의 값은 3 + i)입니다. 그래서 나는 memoization (DP의 일종)과 함께 재귀를 구현했으며,이 방법은 M = 2^80-1 ~ 10^24에 대해 매우 빠르게 작동합니다.

M = 1208944266358702884257791 
Result = 24682648998311664639366438 
Map Size 321 

의사 코드 :

function F(Key) 
    if Map.Contains(Key)then 
     return Map.Value[Key] 
     else 
     usual recursion calls to get Result 
     Map.Add(Key, Result) 

오래된 물건 그대로 질문을 주소 : 고급 수학에 대한 일반적인 해결책을 발견하지 않으려면
, 당신이 계산 된 값을 저장해야합니다. 그렇지 않은 프로그램에 대해, 수학에 대한 때문에

function ExoticFib(m: Integer): Integer; 
var 
    Q: TQueue<Integer>; 
    n, fnm1, fn, fnp1, n2, n21: integer; 
begin 
    if m <= 3 then 
    Exit(m + Ord(m = 0)); //return 1, 1, 2, 3 

    Q := TQueue<Integer>.Create; 
    Q.Enqueue(3); 
    fn := 1; 
    fnp1 := 2; 

    for n := 2 to m div 2 do begin 
    fnm1 := fn;  //forget the oldest value 
    fn := fnp1; 
    fnp1 := Q.Dequeue; //here we have f(n-1), f(n), f(n+1) 
    n2 := fn + fnp1 + n; 
    Q.Enqueue(n2); 
    n21 := fnm1 + fn + 1; 
    Q.Enqueue(n21); 
    end; 

    if Odd(m) then // for m = 2k+1 
    Result := n21 
    else   // for m = 2k 
    Result := n2; 

    Q.Free; 
end; 
+0

고맙습니다 만, 파이썬에서 비슷한 솔루션을 사용하는 동안, n ~ 10^24까지의 값을 계산해야하므로 충분히 빠르지는 않습니다. –

+0

아, 당신은 아마 수학적 솔루션이 필요합니다. 재귀 호출 트리 크기를 평가 했습니까? – MBo

관련 문제