具有多个函数的递归

时间:2016-08-17 20:36:34

标签: recursion common-lisp

你们中的一些人可能会发现这个问题有点奇怪,但我真的想知道这个程序是否递归,这就是我想知道的。

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

感谢您的所有答案!

1 个答案:

答案 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,你应该阅读,其中包含以下内容:

  

龙,在对马丁的问题的假装厌恶之下,   实际上喜欢教他递归。有一天它决定   正式解释递归意味着什么。龙告诉马丁   处理每个递归问题,好像它是一个旅程。如果他   遵循三个递归解决问题的规则,他会永远   成功完成旅程。

     

龙以这种方式解释了规则:

     
      
  1. 知道何时停止。
  2.   
  3. 决定如何迈出一步。
  4.   
  5. 将旅程分解为一步,再加上一段较小的旅程。
  6.   

让我们看看函数howmany和sum

  1. 知道何时停止 当sez为null时,即当列表为nil

  2. 时,它会停止
  3. 决定如何迈出一步

  4. if有两种方式或两者都是0或

    (+ 1 (howmany (cdr sez)))
    (+ (car sez) (sum (cdr sez)))
    
    1. 打破这个步骤加上一个较小的旅程
    2. 在最后的表达式中,列表较小,取出第一个然后继续,使用较小的列表

      所以,这两个函数是递归的,另一个是avg,不是递归的,只关注空列表,以防止除零或零/零不确定。

      希望这有帮助