如何在Clojure中实现这种快速倍频斐波那契算法?

如何在Clojure中实现这种快速倍频斐波那契算法?,clojure,fibonacci,Clojure,Fibonacci,下面是我找到第n个斐波那契数的方法: (defn fib-pair [[a b]] "Return the next Fibonacci pair number based on input pair." [b (+' a b)]) ; Use +' for automatic handle large numbers (Long -> BigInt). (defn fib-nth [x] "Return the nth Fibonacci

下面是我找到第n个斐波那契数的方法:

(defn fib-pair [[a b]]
  "Return the next Fibonacci pair number based on input pair."
  [b (+' a b)])    ; Use +' for automatic handle large numbers (Long -> BigInt).

(defn fib-nth [x]
  "Return the nth Fibonacci number."
  (nth (map first (iterate fib-pair [0 1])) x))
我知道这可能不是最有效的方法,我发现了快速倍增算法

该算法包含矩阵和数学方程,我不知道如何在堆栈溢出中设置它们,请访问:

我尝试了该网站提供的Python实现,速度非常快。如何在Clojure中实现它

编辑:该网站提供的Python实现:

# Returns F(n)
def fibonacci(n):
    if n < 0:
        raise ValueError("Negative arguments not implemented")
    return _fib(n)[0]


# Returns a tuple (F(n), F(n+1))
def _fib(n):
    if n == 0:
        return (0, 1)
    else:
        a, b = _fib(n // 2)
        c = a * (2 * b - a)
        d = b * b + a * a
        if n % 2 == 0:
            return (c, d)
        else:
            return (d, c + d)

我还没有检查性能,但这在Clojure中似乎是一个忠实的实现:

(defn fib [n]
  (letfn [(fib* [n]
            (if (zero? n)
              [0 1]
              (let [[a b] (fib* (quot n 2))
                    c (*' a (-' (*' 2 b) a))
                    d (+' (*' b b) (*' a a))]
                (if (even? n)
                  [c d]
                  [d (+' c d)]))))]
    (first (fib* n))))

非常感谢。代码是有效的。我是Clojure的新手,有些概念对其他人来说很容易,但对我来说可能很难。我还需要更多地了解它。顺便说一句,由于前缀算术运算符,我仍然需要一些用于阅读数学方程的代码。