如何在 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))
)
我必须编写一个执行以下操作的方案函数:
定义一个名为 (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))
)