Racket中的冒泡排序功能

时间:2018-06-11 16:59:51

标签: scheme racket

我正在尝试创建一个函数,bubble,它接受一个(listof Num)并在1次冒泡排序后返回列表。以下是我的代码。

(define (check-numbers-size a b)
  (cond
    [(empty? b) (cons a b)]
    [(> a (list-ref b 0)) (append (list-ref b 0) (append a (rest b)))]
    [else (cons a b)]))


(define (bubble L)
  (foldr (lambda (x y) (check-numbers-size x y)) '() L))


(bubble (list 5 2 4 7 1))

当我尝试运行它时,它会给我以下错误

append: expects a list, given 7

但是我认为b是一个列表,因为我指定了一个空列表作为此泡泡函数的基础。我做错了什么? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

函数append需要两个列表作为输入。

> (append (list 1 2 3) (list 4 5))
(list 1 2 3 4 5)

函数list-ref从列表中提取一个元素:

> (list-ref (list 10 11 12 13 14) 2)
12

在您的代码中,您有以下表达式:

(append (list-ref b 0) ...)

这里的问题是(list-rf b 0)返回的元素不是列表。 要从元素和列表构造新列表,您需要使用列表构造函数cons

(cons (list-ref b 0) ...)

请注意,表达式

中存在类似问题
(append a ...)

答案 1 :(得分:1)

你是对的b恰好是这里的一个列表。但append的其他参数如a(list-ref b 0)呢?

如果你在你的函数上放置签名,显示它们作为参数的内容以及它们返回的内容,则更容易思考这些内容。你说bubble需要一个(Listof Num)并在1次冒泡排序后返回列表。为什么不在代码中写下来呢?

;; bubble : (Listof Num) -> (Listof Num)
;; returns the list after 1 pass of bubble sort
(define (bubble L)
  ...)

您应该为辅助函数check-numbers-size执行相同的操作。你说b是一个清单:

;; check-numbers-size : ??? (Listof Num) -> ???

由于你在正文中使用了(cons a b),我猜你的意思是aNum,以便函数返回(Listof Num)

;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
  ...)

现在我们知道aNumb(Listof Num),我们可以弄清楚append的参数是什么。有两个append次调用可能是问题的原因:

  1. (append a (rest b))
  2. (append (list-ref b 0) (append a (rest b)))
  3. (1)好吗?如果aNumb(Listof Num),则(1)会尝试在append和{Num上调用(Listof Num) {1}}。这是问题的第一个参数a,而不是b。看起来您打算使用cons代替。

    (2)好吗?如果b(Listof Num),那么(list-ref b 0)将是Num。所以看起来(2)试图在appendNum上调用(Listof Num)。就像(1)一样,它是问题的第一个论点。而且,看起来您打算使用cons代替。

    cons函数具有签名X (Listof X) -> (Listof X),其中X可以是Num之类的任何类型。如果您想在列表中添加单个号码时使用cons而不是append,那么您的代码就会达到预期效果:

    ;; check-numbers-size : Num (Listof Num) -> (Listof Num)
    (define (check-numbers-size a b)
      (cond
        [(empty? b) (cons a b)]
        [(> a (list-ref b 0)) (cons (list-ref b 0) (cons a (rest b)))]
        [else (cons a b)]))