最终,我将尝试重新实现链表方案中的排序算法。我编写了一个子过程,该过程将对我有帮助。目的是简单地交换2个元素,将其指定为参数“ pair1和pair2”,然后返回列表。
(define (cons-til lst until)
(cond
((or (null? lst) (eq? (car lst) until)) '())
(else (cons (car lst) (cons-til (cdr lst) until)))))
(define (swap lst pair1 pair2)
(cons (cons (append (cons-til lst (car pair1))
(car pair2)) (car pair1)) (cdr pair2)))
(define my-list '(1 2 3 4 5 6 7))
(swap my-list (cdr (cdr my-list)) (cdr (cdr (cdr my-list))))
执行代码后,它返回:
(((1 2 . 4) . 3) 5 6 7)
我如何解决此问题,以获得简单的方案列表。该元素似乎已正确交换。
答案 0 :(得分:2)
两个建议:
您真的要编写 n cdr
调用以索引 n th 元素吗?我强烈建议使用整数索引(如果需要的话)。
在大多数情况下,尤其是在循环中,按索引引用链表中的元素(即“随机访问”)不是很有效。我强烈建议您使用向量或不需要随机访问的更适合算法,例如e。 G。合并排序。
答案 1 :(得分:0)
(define (swap2 lst pair1 pair2)
(append (append (append (cons-til lst (car pair1))
(list (car pair2)))
(list (car pair1))) (cdr pair2)))
此代码似乎有效。我不确定这是完全有效的解决方案还是明智的解决方案。期待其他建议。返回的值为'(1 2 4 3 5 6 7)