如何在 Scheme 中编写反向函数?

How to Write a Reverse Function in Scheme?

我必须编写一个执行以下操作的方案函数:

定义一个名为 (rev p) 的 SCHEME 函数,它以一对作为参数并计算为 另一对与对 p 中的第一个和第二个元素的顺序相反。例如,

( rev ( cons 1 2))
> (2 . 1)

这是我的代码:

(define (rev p)
  (cond ((null? p) '())
        (not (pair? (car p)) p)
        (else (append (rev (cdr p)) (list (rev (car p))))

然而,我的代码 returns (1 . 2) 当我测试它时它应该返回 (2 . 1)

如果只是要逆向,很简单,递归都不用做!并且记得使用 cons,而不是 append:

(define (rev p)
  (cond ((not (pair? p)) p)
        (else (cons (cdr p) (car p)))))

例如:

(rev '())
=> '()
(rev 5)
=> 5
(rev (cons 1 2))
=> '(2 . 1)

或表示为:

(define (rev p)
  (if (pair? p)
      (cons (cdr p) (car p))
      p))
(define rev
  (lambda (l acc)
    (if (null? l)
        acc
        (rev (cdr l)(cons (car l) acc)))))

(rev '(1 2 3) '())

这里是一个明显混淆的版本,但这些想法可能有用。

(define rev
  (lambda (l k)
    (if (null? l)
        (k (lambda (x) x))
        (rev (cdr l)
             (lambda (k0)
               (k (lambda (r) (k0 (cons (car l) r)))))))))

((rev '(1 2 3) (lambda (x) x)) '())

--

根据 Will 的建议,这是其他变体,非尾递归,因此没有完全 cps,它是经典递归和 cps 的组合。

(define rev
  (lambda (l k)
    (if (null? l)
        (k '())
        (rev (cdr l)
             (lambda (r)
               (cons (car l)
                     (k r)))))))

你需要为这个函数做的就是为你的 pair 使用 car 和 cdr 函数。

(define (rev p)
    (cons (cdr p) (car p))
    )