【问题标题】:Common LISP addition program常用 LISP 加法程序
【发布时间】:2015-05-29 18:57:24
【问题描述】:

我正在尝试编写一个程序,它接收一个数字列表并将列表中的每个元素加 1。同样,如果列表为 0,它将返回 NIL。我尝试以递归方式执行此操作,但它没有显示任何输出。我知道这很简单,但我是一个初学者,我很难递归地思考这个问题。谢谢!

【问题讨论】:

  • 当你说“试图写一个程序”时,你真的是指“试图写一个函数”吗?此外,您说您尝试了一些不起作用的方法...如果您需要有关 your 解决方案的帮助,您最好发布您当前的解决方案,否则没有人可能会给您他们的现成的解决方案。
  • “我尝试递归执行,但没有显示输出。”我在你的问题中没有看到这一点。请注意,寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。
  • "这很简单,但我是初学者,递归地思考问题对我来说真的很困难。" 为什么要递归呢? (defun add-1 (list) (mapcar '1+ list)) 怎么了?您不需要知道 mapcar 是如何实现的(它可能是递归的,但这是一个实现细节)。但你也可以(loop for x in list collect (1+ x))。这似乎是非递归的(尽管实现可能是递归的),而且它也同样有效。听起来您要么在假设要求,要么您有一些您没有说明的要求。

标签: lisp common-lisp


【解决方案1】:

如果你的任务需要你定义一个递归函数(比如my-fun)来对列表的每个元素做一些事情,你可以使用这个习语

(cons (do-something-on (car my-list)) (my-fun (cdr my-list)))

你在哪里

  1. 修改第一个元素
  2. 将您定义的函数应用于列表的其余部分
  3. 返回一个连接修改后的第一个元素的列表以及将您定义的函数应用于列表其余部分的结果

这还不是全部,你必须考虑当你删除列表时会发生什么......但这很简单,如果列表不为空并且@987654323,你可以编写一个返回默认值的条件(见上文) @ 否则。

(if my-list (...) nil)

或者,使用无其他 if 的默认行为,

(if my-list (...))

【讨论】:

    【解决方案2】:

    列表由cons 组成。它具有第一个值和一个列表,该列表由除第一个值之外的列表的其余部分组成。因此,您应该检查您的列表是否为null(或endp,这是相同的),如果不是,则使用first 的计算和使用@ 的递归调用创建cons 987654326@。作为论据。

    (add-1 '(1 . (2 . (3 . ())))) ; ==> (2 . (3 . (4 . ())))
    

    或更常用的写法:

    (add-1 '(1 2 3)) ; ==> (2 3 4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多