Scheme lisp 缺点和列表
Scheme lisp cons and list
我尝试使用我对 cons、cdr、car 的最基本概念来反转 scheme 中的列表。
这里,l-orig
是要反转的列表,l-count
作为计数器。
我的代码在这里:
(define (rev l-orig l-count)
(
if (null? l-count)
(cons l-orig '())
(rev (cons (cdr l-orig) (car l-orig)) (cdr l-count))
)
)
(display (rev '(1 2 3 4 5) '(1 1 1 1 1)))
输出为(((2 3 4 5) . 1))
老实说,我是 lisp 的初学者,在这里我需要一个简单的帮助。
如果我打算使用这种方法,谁能建议我正确的方法?
您正试图在累加器参数的帮助下使用尾递归来反转列表。最好的方法是遍历原始列表和cons
累加器头部的每个元素,最后返回:
(define (rev l-orig l-count)
(if (null? l-orig)
l-count
(rev (cdr l-orig) (cons (car l-orig) l-count))))
请注意,累加器开始时是一个空列表,这非常适合 cons
将每个新元素添加到它:
(rev '(1 2 3 4 5) '())
=> '(5 4 3 2 1)
奥斯卡答对了。你可以使用一个辅助函数,这样你就不需要每次都传入一个空的累加器:
(define (rev xs)
(rev-accum xs '()))
(define (rev-accum xs accum)
(if (null? xs)
accum
(rev-accum (cdr xs) (cons (car xs) accum))))
我尝试使用我对 cons、cdr、car 的最基本概念来反转 scheme 中的列表。
这里,l-orig
是要反转的列表,l-count
作为计数器。
我的代码在这里:
(define (rev l-orig l-count)
(
if (null? l-count)
(cons l-orig '())
(rev (cons (cdr l-orig) (car l-orig)) (cdr l-count))
)
)
(display (rev '(1 2 3 4 5) '(1 1 1 1 1)))
输出为(((2 3 4 5) . 1))
老实说,我是 lisp 的初学者,在这里我需要一个简单的帮助。
如果我打算使用这种方法,谁能建议我正确的方法?
您正试图在累加器参数的帮助下使用尾递归来反转列表。最好的方法是遍历原始列表和cons
累加器头部的每个元素,最后返回:
(define (rev l-orig l-count)
(if (null? l-orig)
l-count
(rev (cdr l-orig) (cons (car l-orig) l-count))))
请注意,累加器开始时是一个空列表,这非常适合 cons
将每个新元素添加到它:
(rev '(1 2 3 4 5) '())
=> '(5 4 3 2 1)
奥斯卡答对了。你可以使用一个辅助函数,这样你就不需要每次都传入一个空的累加器:
(define (rev xs)
(rev-accum xs '()))
(define (rev-accum xs accum)
(if (null? xs)
accum
(rev-accum (cdr xs) (cons (car xs) accum))))