【问题标题】:How to Write a Reverse Function in Scheme?如何在 Scheme 中编写反向函数?
【发布时间】:2020-03-03 21:24:42
【问题描述】:

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

定义一个名为 (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))))

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

【问题讨论】:

  • 从您提供的描述来看,您似乎只处理对而不是列表。
  • 那么(rev '(1 2 3)) ; ==> ((2 3) . 1)?

标签: scheme racket computer-science


【解决方案1】:
(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'd,它是经典递归和 cps 的组合。

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

【讨论】:

  • 这里是some quite crazy way to reverse a list,供您阅读。 :) 重新编写您的代码,它 相当复杂,我只有在完成some sample reductions 之后才能理解它。使用 CPS 也有一种更简单的方法。
  • @WillNess 也完成了您的变体。
  • 你说得对,我也想过,它不是真正的 CPS,它只是构建了 lambda 函数来完成这项工作。
【解决方案2】:

如果你只是想要逆向一个pair,那很简单,你甚至不需要做递归!并且记得使用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)

【讨论】:

    【解决方案3】:

    或同样表示为:

    (define (rev p)
      (if (pair? p)
          (cons (cdr p) (car p))
          p))
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2011-12-10
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多