如何在不使用`reverse`的情况下反转列表中的对?

时间:2014-05-10 00:14:07

标签: scheme

我必须用以下输入编写一个函数:

((something1 . something2) (something1 . something2) ... (something1 . something2))

和相应的输出:

((something2 . something1) (something2 . something1) ... (something2 . something1))

我无法使用vectorforwhilesetreverseset-listlist-tailappendlength或以!结尾的任何程序。

我知道这是错的,但也许有人看到我的错误在哪里:

(define (odwroc-alfabet list)
  (let loop ((list list))
    (if (pair? list)
        (cons ((cdar list) (caar list)))
        list)))

2 个答案:

答案 0 :(得分:1)

创建第一个交换对是不够的。你还需要递归到其余的对中并交换它们。这是您的代码的修改版本:

(define (odwroc-alfabet list)
  (let loop ((list list))
    (if (pair? list)
        (cons (cons (cdar list) (caar list)) (loop (cdr list)))
        list)))

当然,loop在这里用词不当,因为你实际上是在递归而不是循环。

答案 1 :(得分:0)

只需使用map

(define (odwroc-alfabet lst)
  (map (lambda (e) (cons (cdr e) (car e))) lst))