首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球拍中的冒泡排序函数

球拍中的冒泡排序函数
EN

Stack Overflow用户
提问于 2018-06-12 00:59:51
回答 2查看 895关注 0票数 1

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

代码语言:javascript
复制
(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))

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

代码语言:javascript
复制
append: expects a list, given 7

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

EN

回答 2

Stack Overflow用户

发布于 2018-06-12 01:53:28

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

代码语言:javascript
复制
> (append (list 1 2 3) (list 4 5))
(list 1 2 3 4 5)

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

代码语言:javascript
复制
> (list-ref (list 10 11 12 13 14) 2)
12

在你的代码中,你有这样的表达式:

代码语言:javascript
复制
(append (list-ref b 0) ...)

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

代码语言:javascript
复制
(cons (list-ref b 0) ...)

请注意,表达式中也有类似的问题

代码语言:javascript
复制
(append a ...)
票数 1
EN

Stack Overflow用户

发布于 2018-06-12 02:05:53

你说得对,b恰好是这里的一个列表。但是,像a(list-ref b 0)这样的append的其他论点又如何呢?

如果你在你的函数上加签名,以显示它们接受什么作为参数,以及它们返回什么,就更容易考虑这些事情。您说过bubble接受一个(Listof Num),并在1次冒泡排序后返回列表。为什么不在代码中写下来呢?

代码语言:javascript
复制
;; bubble : (Listof Num) -> (Listof Num)
;; returns the list after 1 pass of bubble sort
(define (bubble L)
  ...)

您应该对帮助器函数check-numbers-size执行相同的操作。你说过b是一个列表:

代码语言:javascript
复制
;; check-numbers-size : ??? (Listof Num) -> ???

代码语言:javascript
复制
;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
  ...)

有两个append调用可能是导致问题的原因:

  1. (append a (rest b))
  2. (append (list-ref b 0) (append a (rest b)))

(1)可以吗?如果aNumb(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

代码语言:javascript
复制
;; 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)]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50802747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档