【问题标题】:LISP programmingLISP 编程
【发布时间】:2017-03-07 06:57:58
【问题描述】:
(defun bubbleUp (n)
  (cond
    ((null n) nil)
    ((null (cdr n)) n)
    ((> (car n) (car (cdr n)))
     (append (list (car (cdr n)))
             (bubbleUp (cons (car n) (cdr (cdr n))))))
    (t (append (list (car n)) (bubbleUp (cdr n))))))

我想写一个使用这个bubbleUp函数的排序函数。

调用排序将输出以下内容:

> (sort ‘(5 4 3 2 1)) > (1 2 3 4 5)

> (sort ‘(6 4 3 9 8))

> (3 4 6 8 9)

但我只想使用 LISP 函数:defun、cond、car、cdr、list、cons、append、>、=、

【问题讨论】:

  • 你应该从阅读 LISP 文档开始.然后尝试并提出一个您遇到困难的具体问题。

标签: lisp common-lisp


【解决方案1】:

据我了解您的问题,您必须再次应用bubble-up(这将是一种更简洁的函数命名方式),直到(apply #'< sorted-list) 为真,其中sorted-listbubble-up 的结果。

当然,这只是一个家庭作业解决方案,如果性能可能成为问题,则不应使用。此外,您应该考虑在 SO 上完成作业是否聪明;-)

我猜,最简单的模式应该是这样的(将你的函数作为给定的气泡):

(defun bubble-sort (list)
  (cond ((apply #'< list) list)
        (t (bubble-sort (bubble-up list)))))

CL-USER> (bubble-sort '(6 4 3 9 8 10 1 12))
==> (1 3 4 6 8 9 10 12)

但请注意,我不是一个非常有经验的 Lisp 程序员,而且这段代码非常低效。如果你真的想对一个列表进行排序,你应该使用 sort 并阅读更多关于尾调用优化和迭代的信息。信息选项卡有更多资源。

【讨论】:

  • 你能指导我吗?我是 LISP 编程的新手。我知道如何在 C 中执行此操作,但我不知道如何在 LISP 中执行此操作。我被困住了。如果您能帮助我,我将非常感激。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2012-05-03
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多