List 方案中的气泡排序
我正在编写一个递归代码来进行冒泡排序(通过交换从最小到最大)List 方案中的气泡排序,list,sorting,scheme,bubble-sort,List,Sorting,Scheme,Bubble Sort,我正在编写一个递归代码来进行冒泡排序(通过交换从最小到最大) 我有一个代码只做一次冒泡排序 (define (bubble-up L) (if (null? (cdr L)) L (if (< (car L) (cadr L)) (cons (car L) (bubble-up (cdr L))) (cons (cadr L) (bubble-up (cons (car L) (cddr L)))) ) ) 但是递归似乎没有发生,因
我有一个代码只做一次冒泡排序
(define (bubble-up L)
(if (null? (cdr L))
L
(if (< (car L) (cadr L))
(cons (car L) (bubble-up (cdr L)))
(cons (cadr L) (bubble-up (cons (car L) (cddr L))))
)
)
但是递归似乎没有发生,因为它只排序一次任何建议都欢迎,我只是被难住了 试试这个:
(define (bubble-sort-aux N L)
(cond ((= N 1) (bubble-up L))
(else (bubble-sort-aux (- N 1) (bubble-up L)))))
如果您一直“冒泡”列表,它将在最后排序。您的代码的问题是,您没有使用冒泡
的结果进行任何操作-但是如果我们将冒泡
返回的值传递给函数的下一次调用,它最终将被排序。现在程序按预期工作:
(bubble-sort-aux 6 (list 8 9 4 2 6 7))
=> '(2 4 6 7 8 9)
我的实施:
(define (bubble-swap ls)
(if (null? (cdr ls))
ls
(if (> (car ls) (cadr ls))
(cons (cadr ls) (bubble-swap (cons (car ls) (cddr ls))))
(cons (car ls) (bubble-swap (cdr ls))))))
(define (len ls)
(if (null? ls)
0
(+ 1 (len (cdr ls)))))
(define (bubblesort_ ls n)
(if (= n 1)
ls
(bubblesort_ (bubble-swap ls) (- n 1))))
(define (bubblesort ls) (bubblesort_ ls (len ls)))
我实现了一个自定义的
len
函数,但是如果可用,您可以使用标准的length
函数。“我正在编写一个递归代码来进行冒泡排序”-不要@MitchWheat AveryPoole正在编写Scheme,规范规定了尾部调用优化。迭代通常通过Scheme中的尾部递归实现。在方案中实现这一点很自然。是否有其他方法?刚开始编写代码,尾部递归是我学到的唯一方法@MitchWheat@Joshua泰勒:我指的是一般使用BubbleSort。Scheme(至少R5RS)支持do
迭代构造,但在Scheme中使用尾部递归来表示迭代更为常见。例如,ÓscarLópez的答案表面上是递归的,但由于对气泡排序aux
的调用处于尾部位置,因此本质上是迭代的。不过,您的冒泡
不是尾部递归的。你可以考虑尝试让它的尾巴递归,too.谢谢吨奥斯卡!我想我有点累了,这是一个很大的错误=/
(define (bubble-swap ls)
(if (null? (cdr ls))
ls
(if (> (car ls) (cadr ls))
(cons (cadr ls) (bubble-swap (cons (car ls) (cddr ls))))
(cons (car ls) (bubble-swap (cdr ls))))))
(define (len ls)
(if (null? ls)
0
(+ 1 (len (cdr ls)))))
(define (bubblesort_ ls n)
(if (= n 1)
ls
(bubblesort_ (bubble-swap ls) (- n 1))))
(define (bubblesort ls) (bubblesort_ ls (len ls)))