Recursion 具有多个函数的递归

Recursion 具有多个函数的递归,recursion,common-lisp,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

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

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

谢谢你的回答

首先,看一看您的代码并对其进行更多的格式化,以便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表达式计算这些函数

对于这三个函数,平均值、总和和数量

有一个故事叫《马丁与龙》,你可以在第8章中找到,你应该读一下,在:

这条龙假装讨厌马丁的问题, 实际上我很喜欢教他递归。有一天,它决定 正式解释递归的含义。龙叫马丁去 对待每一个递归问题,就好像它是一次旅行。如果他 他总是遵循三条递归解决问题的规则 成功地完成旅程

龙这样解释规则:

  • 知道什么时候停止
  • 决定如何迈出一步
  • 把旅程分成那一步,再加上一小段旅程
  • 让我们看看函数howmount和sum

  • 知道什么时候停止 当sez为空时,即当列表为零时,它停止

  • 决定如何迈出一步

  • if有两种方式,或两种方式都有0

    (+ 1 (howmany (cdr sez)))
    (+ (car sez) (sum (cdr sez)))
    
  • 把joourney分解成那一步,再加上一小段旅程
  • 在最后一个表达式中,列表较小。取出第一个表达式,然后继续使用较小的列表

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


    希望这有助于

    阅读未格式化的Lisp代码几乎是不可能的。请缩进你的代码。例如,您的代码应该看起来像:。使用问题下面的链接。你问的问题并不清楚。SUM调用本身,以及有多少个调用本身,所以这两个调用都是递归的。请注意,您可以只执行
    (defun avg(seq)(/(reduce'+seq)(length seq))
    。无需重新实现length和列表求和函数。但您使用的是内置函数:+,/,null,car,cdr(这是一些内置非函数的顶部:defun和if)。最终调用其实现的函数名称的每个函数都是递归的。您的所有函数都是这样做的。它们甚至是递归过程,因为它们增加了堆栈,而您可以通过使用累加器轻松完成所有这些迭代过程。您可能很快就会了解更多信息:-)
    sez
    是某种语言的列表吗?如果你自己不能理解这一点,你一定不明白“递归”是什么意思。