在交换过程中无法获取我想要的结束列表

时间:2019-01-25 10:24:54

标签: sorting scheme lisp racket r5rs

最终,我将尝试重新实现链表方案中的排序算法。我编写了一个子过程,该过程将对我有帮助。目的是简单地交换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)

我如何解决此问题,以获得简单的方案列表。该元素似乎已正确交换。

2 个答案:

答案 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)