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))))