本文给出的是autolisp的实现。autolisp作为lisp的一门方言,基本上与common lisp没有差异, 对本文代码稍加修改,即可应用于common lisp的interperter。

斐波那契数列

百度百科给出的解释如下:

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci) 以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

在数学上,斐波那契数列的递推定义:

1
2
3
F(0)=1
F(1)=1
F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

斐波那契数列的autolisp的实现:

1
2
3
4
5
6
(defun fib  (n)
  ;; 斐波那契数列求值函数
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (if (or (= 0 n) (= 1 n))
    1
    (+ (fib (1- n)) (fib (- n 2)))))

帕多瓦数列

帕多瓦数列(Padovan sequence),与斐波那契数列类似, 指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、55……

在数学上,帕多瓦数列的递推定义:

1
2
3
4
F(0)=1
F(1)=1
F(2)=1
F(n)=F(n - 2)+F(n - 3)(n ≥ 3)

帕多瓦数列的autolisp的实现:

1
2
3
4
5
6
(defun pad  (n)
  ;; 帕多瓦数列求值函数
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (if (or (= 0 n) (= 1 n) (= 2 n))
    1
    (+ (pad (- n 2)) (pad (- n 3)))))

Newman-Conway数列

Newman-Conway数列, 指的是这样一个数列:1 1 2 2 3 4 4 4 5 6 7 7……

在数学上,Newman-Conway数列的递推定义:

1
P(n) = P(P(n - 1)) + P(n - P(n - 1)) 

Newman-Conway数列的autolisp的实现:

1
2
3
4
5
(defun newcon  (n / n2)
  ;; Newman-Conway数列求值函数
  ;; 作者:徐工, 微博:@徐工徐工2020,头条:@徐工徐工
  (cond ((or (= 1 n) (= 2 n)) 1)
        (t (setq n2 (newcon (1- n))) (+ (newcon n2) (newcon (- n n2))))))

结语

本文代码没有对输入值进行合法性检查,调用相关函数前应做好校验,防止陷入无限循环。