편집 :
귀하의 의견에 따르면, 당신은 아마도 빠른 해결책을 필요로하지 않을 것입니다. 재귀 트리의 크기를 확인했습니다 - 놀랍도록 작은 - 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;
출처
2015-01-06 16:10:42
MBo
이 질문은 주제에서 벗어난 것으로 보인다 :이 저장소로 큐를 사용하여 델파이로 작성 비 재귀 (반복) 함수의 예입니다. –
'2n'은 당신이 링크 한 질문보다 이것을 어렵게 만듭니다. 이 질문이 math.se로 옮겨지면 더 나은 행운을 누릴 수 있습니다. – Teepeemm
당신의 재발 관계는 당신이 링크 한 게시물의 것보다 훨씬 더 복잡합니다. 우선, 요소의 정의는 이전 요소에 의존하지 않고 'n/2'에 의존하므로 동일한 종류의 행렬로 동일한 반복을 표현할 수 없습니다. 그런 다음, 짝수와 홀수 모두에 사용되는 단일 수식 대신 두 가지 수식이 있습니다. 마지막으로 2 개의 연속 요소에 대한 정의는 {2n-1,2n} 대신 {2n-1,2n} 또는 {2n + 1,2n + 2}를 사용하는 경우에도 'n/2' , 2n + 1} '). – Cimbali