Function 令人不安的括号?

Function 令人不安的括号?,function,recursion,lisp,Function,Recursion,Lisp,我想使用递归函数编写代码,以取消列表中的括号 以下是一个例子: (unnest '(1 (2 (3)) (4 5))) ==> (1 2 3 4 5) 基本思路如下: 如果您有一个空列表,那么您显然不需要取消它 如果它不是一个列表,那么它必须是一个原子,因此返回一个包含该原子的列表 在最后一个条件中,您有一个列表,所以您基本上说:未赋值列表的结果是附加到列表其余部分的未赋值版本的第一个元素的未赋值版本,也就是说,递归处理其余部分 希望有帮助。或者更简单地说,我们在树上行走,然后选择叶

我想使用递归函数编写代码,以取消列表中的括号

以下是一个例子:

(unnest '(1 (2 (3)) (4 5))) ==> (1 2 3 4 5)
基本思路如下:

  • 如果您有一个空列表,那么您显然不需要取消它
  • 如果它不是一个列表,那么它必须是一个原子,因此返回一个包含该原子的列表
  • 在最后一个条件中,您有一个列表,所以您基本上说:未赋值列表的结果是附加到列表其余部分的未赋值版本的第一个元素的未赋值版本,也就是说,递归处理其余部分

希望有帮助。

或者更简单地说,我们在树上行走,然后选择叶节点,然后递归地将其附加到列表中。避免再次重建树结构的诀窍是使用
append
函数。是的,这更简单:P.顺便问一下,为什么要将
t
替换为
else
else
用于Scheme。是的,我尝试了Scheme,我认为
t
是一个错误:o)如果需要,请回滚我的编辑。顺便说一句,什么是
t
?当然,没问题
t
是LISP的
t
rue值;在
cond
:)中不使用特殊
else
大小写的一种廉价方法。该函数通常称为flatte。在SICP书籍-练习2.28,第111页中,它也被称为
条纹。这对我来说是递归的经典aha时刻。
(defun unnest (lst)
  (cond ((null? lst) '())
        ((not (list? lst)) (list lst))
        (t
         (append (unnest (car lst))
                 (unnest (cdr lst))))))

> (unnest '(1 (2 (3)) (4 5))) 
(1 2 3 4 5)