【问题标题】:Common Lisp Returning members of a list from one index to anotherCommon Lisp 将列表的成员从一个索引返回到另一个索引
【发布时间】:2021-05-27 14:20:47
【问题描述】:

这是我到目前为止尝试过的,但我遇到了一些错误,我有点困惑

想要做的是:

例如调用 (sub-list((2 3 4 5 6) 2 3)) 将产生一个递归函数,如

x = 1,(子列表('(3 4 5 6) 2 3))

x = 2, cons (car ls) (sub-list((4 5 6) 2 3))

x = 3 ,cons (car ls) (sub-list((5 6) 2 3))

x = 4 , nil 因为 x 现在大于 to。

它应该回溯以返回 (4 5) 类似的东西

(defvar *x* 1)      

(defun sub-list(ls from to)
    (cond
        ((<= *x* from) (sub-list((cdr ls) from to)))
        ((<= from *x* to)
            (let (*x* (+ *x* 1))
                cons a (sub-list((cdr ls) from to)))))
        ((> *x* to) nil)))     

【问题讨论】:

  • 我不认为 (sub-list((2 3 4 5 6) 2 3)) 是合法的 Lisp。
  • 您能解释一下sub-list 应该做什么,而与它如何做到这一点无关?
  • 对不起,我忘记了撇号 (sub-list('(2 3 4 5 6) 2 3)) 应该返回列表的索引 2 到 3,这将是 (3 4)案例(索引从 1 开始)
  • 请注意,(sub-list lst a b) = (sub-list (cdr lst) (- a 1) (- b 1))(假设 a>1)。
  • "_... 我遇到了一些错误.... _" -- 这些错误是什么?您的问题是(sub-list('(2 3 4 5 6) 2 3)) --> (4 5),但您的最后一条评论说应该返回(3 4):它是哪个?发布的代码不会编译;那是错误吗?如果是这样,请检查括号。您可能不应该在这里为*x* 使用动态变量。

标签: common-lisp


【解决方案1】:

作为一般建议,不建议使用全局变量和特殊变量来跟踪内部状态。

正如@coredump 在评论中指出的那样,Sublist in Lisp 的答案指向了正确的方向。

为了避免特殊变量,您可以(原则上)更改开始和结束索引(正如@ScottHunter 指出的那样)。

这意味着您可以将“开始累积”从(&lt;= *x* from) 更改为(&lt;= from 0),将“结束累积”更改为(&lt;= to 0)

这还需要将每个递归调用更改为类似于(sub-list (cdr list) (1- from) (1- to))(并消除初始跳过阶段中的错误,在该阶段您不会递增*x*)。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多