【问题标题】:Trying to build a list in Scheme/Racket试图在 Scheme/Racket 中建立一个列表
【发布时间】:2015-10-23 21:54:44
【问题描述】:

我对 Scheme 很陌生,无法理解为什么这对我不起作用。我正在尝试从 BST 结构返回一个有序列表,但似乎无法将其用于 cons 或将汽车附加到列表中。我显然做错了什么。有什么建议么?谢谢。

(define (sortList lst)
  (printList '(16 (8 (2 () ()) (10 () ())) (20 (18 () ()) (30 () ()))) (list) )
)

(define (printList lst sorted)

  ; recur smaller
  (unless (null? (cadr lst))
    (cons (printList (cadr lst) sorted) sorted))

  ; debugging...
  (writeln (car lst))

  ; build sorted list
  (cons (car lst) sorted )

  ; recur larger
  (unless (null? (caddr lst))
    (cons (printList (caddr lst) sorted) sorted))

  ; return sorted lst
  sorted
)

【问题讨论】:

  • Scheme 没有声明,你糟糕的格式似乎暗示了这一点。
  • 您介意详细说明一下吗?我不明白你的说法。
  • (cons 2 sorted) 创建一个新列表 - 它不会更改存储在 sorted 中的现有值。
  • 啊,该死的,当然!谢谢! - 这是我已经工作了大约 12 个小时的一项更大任务的一部分,我的思绪开始让我失望了……;D

标签: scheme lisp racket binary-search-tree


【解决方案1】:

我想出了一个快速的解决方案:

(define (tree->list tree)
  (let recur ((x tree)
              (acc '()))
    (if (null? x)
        acc
        (recur (cadr x)
               (cons (car x)
                     (recur (caddr x) acc))))))

例子:

> (tree->list '(16 (8 (2 () ()) (10 () ())) (20 (18 () ()) (30 () ()))))
(2 8 10 16 18 20 30)

它的工作方式是我有一个累加器 (acc),它从一个空列表开始。然后递归函数(recur)检查当前元素是否为空:如果是,则不要更改累加器;否则,递归到右侧分支,然后将当前元素添加到结果中,然后递归到左侧分支。

cons 从右到左构建列表,因此在左手分支之前递归到右手分支。 (否则,列表会颠倒。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2021-01-04
    • 2015-01-08
    • 2020-07-17
    • 2019-04-13
    • 2021-01-06
    • 2011-07-10
    相关资源
    最近更新 更多