Lisp中的返回值

时间:2012-09-20 15:07:26

标签: recursion lisp return

所以我昨天开始学习Lisp并开始做一些问题。

我正在做的事情是在列表中插入/删除原子,同时保持列表相同,例如:(delete 'b '(g a (b) l))将给我(g a () l)

我遇到麻烦的还有这个问题。 我想检查一下原子存在的列表中的任何地方。

我追踪它,并说它一度返回T,但后来被nil覆盖。

你们可以帮忙:)?

我正在使用(appear-anywhere 'a '((b c) g ((a))))

在第4次函数调用时返回T但后来变为nil

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))

1 个答案:

答案 0 :(得分:3)

让我们看一个明显的问题:

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))

想想上面的最后几行。

让我们稍微改变格式。

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T
    (appear-anywhere a (car l))
    (appear-anywhere a (cdr l)))))

最后三行:作为默认值(这就是T存在的原因),将计算最后两个表格。首先是第一个,然后是第二个。永远不会使用或返回第一个表单的值。

这可能不是你想要的。

目前,当a的值出现在列表的其余部分的任何位置时,您的代码才会返回一些内容。第一种形式从未真正使用过。

提示:什么是正确的逻辑连接器?