【发布时间】:2023-03-29 22:43:01
【问题描述】:
现在,我确实一直坚持实现此功能,但找不到合适的资源来进一步帮助我。
我正在尝试实现数字排序,即按升序对列表中的值进行排序。
我目前的实现是:
(define num-sort
(lambda (ls)
(if(null? (cdr ls))
ls
(if(< (car ls) (cadr ls))
(append (car ls) (num-sort(cdr ls)))
(if(> (car ls) (cadr ls))
(append (num-sort(cdr ls)) (car ls))
(num-sort(cdr ls))
)))))
我在计划和逻辑上理解事情是如何完成的方面度过了一段非常艰难的时光。
我的“追加”功能是我在此之前实现的功能,它似乎按预期工作:
(define append
(lambda (ls1 ls2)
(if (null? ls1)
ls2
(if (pair? ls1)
(cons (car ls1) (append (cdr ls1) ls2))
(cons ls1 ls2)))))
我知道这里的递归存在问题,因为当我比较两个元素并决定进行另一个递归调用时,它完全搞砸了顺序 - 但是我不确定如何解决这个问题。
在我的脑海中,我正在考虑通过将每个元素与相邻元素进行比较来组装一个列表。通常,我会尝试通过存储和访问另一种语言的数组/变量的索引来做到这一点,但我无法理解如何在这个语言中正确排序。
【问题讨论】:
-
您要实现哪个sorting algorithm?
-
除插入排序外的任何东西。我不确定如何实现冒泡排序或合并排序。
-
然后你可以使用例如在这个page中找到的快速排序的实现。
-
谢谢,我会试着感受一下。知道如何在 Scheme 中实现这两种排序算法是否有利?
-
@ChristopherKelly 向初学者教授冒泡排序的唯一原因是让他们可以练习循环。这是一个非常糟糕的算法,根本不适合递归,除了教初学者循环之外,不应该用于任何事情。另一方面,归并排序是高效且自然递归的。