(defun howmany(sez)
(if (null sez)
0
(+ 1 (howmany (cdr sez)))))
(defun sum(sez)
(if (null sez)
0
(+ (car sez) (sum(cdr sez)))))
(defun avg(sez)
(if (null sez)
0
(/ (sum sez) (howmany sez))))
(print (avg '(100 200 300)))
感谢您的所有答案!
答案 0 :(得分:1)
首先,看看你的代码并将其格式化一点,以便轻松阅读lisper
(defun howmany (sez)
(if (null sez)
0
(+ 1 (howmany (cdr sez)))))
(defun sum (sez)
(if (null sez)
0
(+ (car sez) (sum (cdr sez)))))
(defun avg (sez)
(if (null sez)
0
(/ (sum sez) (howmany sez))))
(print (avg '(100 200 300)))
然后分析这个脚本,它包含三个函数和一个评估函数的最后一个s表达式。
对于这三个函数,avg,sum和howmany,
有一个名为马丁和龙的故事,你可以在第8章找到Common Lisp: A Gentle Introduction to Symbolic Computation,你应该阅读,其中包含以下内容:
龙,在对马丁的问题的假装厌恶之下, 实际上喜欢教他递归。有一天它决定 正式解释递归意味着什么。龙告诉马丁 处理每个递归问题,好像它是一个旅程。如果他 遵循三个递归解决问题的规则,他会永远 成功完成旅程。
龙以这种方式解释了规则:
- 知道何时停止。
- 决定如何迈出一步。
- 将旅程分解为一步,再加上一段较小的旅程。
醇>
让我们看看函数howmany和sum
知道何时停止 当sez为null时,即当列表为nil
决定如何迈出一步
if有两种方式或两者都是0或
(+ 1 (howmany (cdr sez)))
(+ (car sez) (sum (cdr sez)))
在最后的表达式中,列表较小,取出第一个然后继续,使用较小的列表
所以,这两个函数是递归的,另一个是avg,不是递归的,只关注空列表,以防止除零或零/零不确定。
希望这有帮助