【问题标题】:LISP recursive pairing?LISP递归配对?
【发布时间】:2016-03-09 00:41:11
【问题描述】:

我是 LISP 的新手,我正在尝试创建一个递归函数来配对列表中的元素。通过添加递归,我被困在函数的最后一部分。

(defun pairup (L)
(cond((null L) nil))
(list (cons (car L) (cadr L)(pairup(cdr L)))))

我知道(pairup(cdr L)))))) 会显示错误,因为它的第三个参数进入了 cons。不知道如何再次添加函数 =/

输入:(pairup'(1 2 3 4))

输出:((1 2) (3 4))

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    函数如下:

    (defun pairup (l)
      (cond ((null l) nil)
            ((null (cdr l)) (list l))   
            (t (cons (list (car l) (cadr l))
                     (pairup (cddr l))))))
    
    (pairup '(1 2 3 4))   ;  produces ((1 2) (3 4))
    (pairup '(1 2 3))     ;  produces ((1 2) (3))
    

    注意cond 的第二个分支是在只剩下一个元素时终止递归,如果初始列表有奇数个元素,这是必要的。 cond 的语法要求分支的第一种形式始终是条件,而在最后一个分支中,条件是 t 以捕获所有其他情况。

    【讨论】:

    • 啊。我懂了。原始代码将为(pair-up '(1 2 3)) 生成((1 . 2) (3)),而您的代码将生成((1 2) (3))(我更多地依赖答案中的代码并收回我的评论)。
    • 感谢您的解释!我终于能够得到它=)
    猜你喜欢
    • 2015-09-07
    • 2014-11-26
    • 1970-01-01
    • 2018-06-19
    • 2013-05-03
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多