Числа Фибоначчи через преобразование

Существует хитрый алгоритм получения чисел Фибоначчи за логарифмическое число шагов. Вспомните трансформацию переменных состояния a и b процесса fib-iter из раздела 1.2.2: a ← a + b и b ← a . Назовем эту трансформацию T и заметим, что n-кратное применение T , начиная с 1 и 0, дает нам пару Fib(n + 1) и Fib(n) . Другими словами, числа Фибоначчи получаются путем применения Tⁿ , n-ой степени трансформации T , к паре (1,0) . Теперь рассмотрим T как частный случай p = 0 , q = 1 в семействе трансформаций Tpq , где Tpq преобразует пару (a,b) по правилу a ← bq + aq + ap, b ← bp + aq . Покажите, что двукратное применение трансформации Tpq равносильно однократному применению трансформации Tp′q′ того же типа, и вычислите p′ и q′ через p и q . Это дает нам прямой способ возводить такие трансформации в квадрат, и таким образом, мы можем вычислить Tⁿ с помощью последовательного возведения в квадрат, как в процедуре fast-expt . Используя все эти идеи, завершите следующую процедуру, которая дает результат за логарифмическое число шагов:

(define (fib n)
  (fib-iter 1 0 0 1 n))
(define (fib-iter a b p q count)
  (cond ((= count 0) b)
        ((even? count)
         (fib-iter a
                   b
                   <??>      ; compute p'
                   <??>      ; compute q'
                   (/ count 2)))
        (else (fib-iter (+ (* b q) (* a q) (* a p))
                        (+ (* b p) (* a q))
                        p
                        q
                        (- count 1)))))

Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход