Common lisp 为什么斐波那契序列的结果在某个数之后开始发散?

Common lisp 为什么斐波那契序列的结果在某个数之后开始发散?,common-lisp,sbcl,Common Lisp,Sbcl,我对通过不同方式计算序列的结果感到困惑: (defun fig-square-p (n) "Check if the given N is a perfect square number. A000290 in the OEIS" (check-type n (integer 0 *)) (= (floor (sqrt n)) (ceiling (sqrt n)))) (defun fibonaccip (n) "Check if the given number N is

我对通过不同方式计算序列的结果感到困惑:

(defun fig-square-p (n)
  "Check if the given N is a perfect square number.

 A000290 in the OEIS"
  (check-type n (integer 0 *))
  (= (floor (sqrt n)) (ceiling (sqrt n))))

(defun fibonaccip (n)
  "Check if the given number N is a Fibonacci number."
  (check-type n (integer 0 *))
  (or (fig-square-p (+ (* 5 (expt n 2)) 4))
      (fig-square-p (- (* 5 (expt n 2)) 4))))

(defun fibonacci (n)
  "Compute N's Fibonacci number."
  (check-type n (integer 0 *))
  (loop :for f1 = 0 :then f2
     :and f2 = 1 :then (+ f1 f2)
     :repeat n :finally (return f1)))

(defun seq-fibonaccies (n)
  "Return sequence of Fibonacci numbers upto N."
  (check-type n (integer 0 *))
  (loop :for i :from 1 :upto n
     :collect (fib i)))
当我增加循环的极限时,结果开始发散得更多

~$ sbcl --version
SBCL 1.4.14-3.fc31

fibonaccip
将给出一个估计值,因为您没有5的平方根的精确值。随着n值的增加,误差也会增加。

fibonaccip将给出一个估计值,因为您没有5的平方根的精确值。随着n值的增加,误差也会增加。

正如其他人已经提到的,舍入误差积累得很快, 所以你应该坚持整数运算,使用 :

此外,您在
seq fibonaccies
中有一个打字错误(
fib
而不是
fibonacci

最后,
seq fibonaccies
的参数是二次的,而
必须是线性的。

正如其他人已经提到的,舍入误差积累得很快, 所以你应该坚持整数运算,使用 :

此外,您在
seq fibonaccies
中有一个打字错误(
fib
而不是
fibonacci

最后,
seq fibonaccies
的参数是二次的,而 必须是线性的

~$ sbcl --version
SBCL 1.4.14-3.fc31
(defun squarep (n)
  "Check if the given N is a perfect square number.
https://oeis.org/A000290"
  (check-type n (integer 0 *))
  (let ((sqrt (isqrt n)))
    (= n (* sqrt sqrt))))