【问题标题】:Bubble sort function in RacketRacket 中的冒泡排序功能
【发布时间】:2018-06-12 02:05:53
【问题描述】:

我正在尝试创建一个函数,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 是一个列表,因为我指定了一个空列表作为此气泡函数的基础。我做错了什么? 感谢您的帮助。

【问题讨论】:

    标签: scheme racket


    【解决方案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 ...)
    

    【讨论】:

      【解决方案2】:

      你说得对,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),我猜您的意思是让a 成为Num,以便函数返回(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)))

      (1)可以吗?如果aNum 并且b(Listof Num),那么(1) 试图在Num(Listof Num) 上调用append。这是第一个参数a,这就是问题所在,而不是b。您似乎打算改用 cons

      (2)可以吗?如果b(Listof Num),那么(list-ref b 0) 将是Num。所以看起来 (2) 正试图在 Num(Listof Num) 上调用 append。就像 (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)]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        相关资源
        最近更新 更多