在Scheme中对列表进行排序

时间:2018-02-06 05:13:44

标签: list sorting scheme

我有一个函数,它接受一个列表并输出该列表的powerset。所以,(1 2 3)它应该输出(() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))

我目前正在获取正确的值,它只是没有很好的顺序。当前输出为(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))

我编写了两个函数,这些函数将被传递给标准排序函数,以检查每个元素的长度以及它是否按顺序排序并相应地排序。输出结果为((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) ())

鉴于最终列表是(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))

,我在这两个函数中做错了什么

;定义元素排序

(define (element-ordered? ls0 ls1)
    (cond
        [(equal? ls0 ls1) #t]
        [(< (car ls0) (car ls1)) #t]
        [else #f]))

;定义长度排序

(define (length-ordered? ls0 ls1)
    (cond
        [< (length ls0) (length ls1) #t]
        [> (length ls0) (length ls1) #f]
        [eq? (length ls0) (length ls1) (element-ordered? ls0 ls1)]))

;使用提供的排序

排序
(sort final-list length-ordered?))

1 个答案:

答案 0 :(得分:0)

我不确定你的element-ordered?功能是否正确。这就是我想出的:

(define (element-ordered? ls0 ls1)
    (cond
        ((< (car ls0) (car ls1)) #t)
        ((> (car ls0) (car ls1)) #f)
        (else (element-ordered? (cdr ls0) (cdr ls1)))
    )
)

(define (length-ordered? ls0 ls1)
    (cond
        ((< (length ls0) (length ls1)) #t)
        ((> (length ls0) (length ls1)) #f)
        (else (element-ordered? ls0 ls1))
    )
)

另请注意,在您的代码段中,length-ordered?的条件没有正确括号,因此这可能也会导致您的函数出现问题。