2016-08-17 102 views
-3

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

(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

这几乎是不可能读取无格式的Lisp代码。请缩进你的代码。例如,您的代码应该如下所示:http://pastebin.com/raw/ZdPp8A0i。使用问题下的[编辑](http://stackoverflow.com/posts/39005847/edit)链接。 –

+0

虽然你不清楚你在问什么。 SUM自己调用,HOWMANY自己调用,所以这些都是递归的,当然。请注意,你可以'(defun avg(seq)(/(reduce'+ seq)(length seq))''不需要重新实现LENGTH和列表求和功能。 –

+0

这个东西是不允许用在所有必须实现的功能,但是我的想法是,这是递归的,我只是想让更多的人对它进行一些考虑。 – anthraxa

回答

1

首先,来看看你的代码和格式化多一点点,以便由利斯佩尔

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

轻松读取然后analize这个脚本,它包含三个功能的最后S-评估功能的表达。

对于此三种功能,平均,总和的howmany,

有一个标题为马丁和龙一个故事,你可以在第8章从这里Common Lisp: A Gentle Introduction to Symbolic Computation找到和你应该阅读,其sumarizes在:

龙对于马丁的问题不屑一顾, 居然喜欢教他递归。有一天它决定以 正式解释递归的含义。龙告诉马丁 处理每一个递归问题,就好像它是一次旅程。如果他按照递归解决问题的三条规则,他总是会成功地完成行程 。

龙解释的规则是这样的:

  1. 知道什么时候停止。
  2. 决定如何采取一步。
  3. 打破这一步,再加上一个较小的旅程。

让我们来看看功能的howmany和总结

  1. 知道什么时候停止 停止经济特区的时候是空的,即当列表是零

  2. 决定如何采取一个步骤

如果有两种方式或两种方式都是0或

(+ 1 (howmany (cdr sez))) 
(+ (car sez) (sum (cdr sez))) 
  • 打破joourney分解成步骤加一个较小的旅程
  • 过去表达式

    ,该列表是较小的取出,然后再继续,较小的列表

    所以,这两个函数是递归的,另一个avg不是递归的,只需要关心空的列表,以防止被零或零/零不确定分割。

    希望这会有帮助