球拍附加不需要的列表反转
Racket Append Undesired Reversal of List
我写了一个小函数,它接受一个列表和 returns 一个仅由正数组成的列表。这一切都很好,但由于某种原因,它正在颠倒顺序。下面有更多信息。有人可以告诉我这是否正常,或者我是否漏写了什么?提前谢谢你。
(define (positive-nums-only lst)
(if (empty? lst)
'()
(append (positive-nums-only (cdr lst))
(if (>= (car lst) 0)
(list (car lst))
'()))))
(positive-nums-only '(1 2 -4 90 -4))
上面的测试用例returns'(90 2 1)
你试过反转追加吗?
(define (positive-nums-only lst)
(if (empty? lst)
'()
(append (if (>= (car lst) 0) (list (car lst)) '())
(positive-nums-only (cdr lst)))))
个人觉得这样写比较自然:
(define (positive-nums-only lst)
(if (empty? lst)
'()
(let ((rest (positive-nums-only (cdr lst))))
(if (>= (car lst) 0)
(cons (car lst) rest)
rest))))
你没有弄错,程序正在按照你的要求进行。
看,程序先完成递归调用,然后再解析 if
语句。这会导致 (list ... )
从最后一个正元素开始列出,在本例中它将是 90
。
更改代码顺序将产生您想要的结果。
(define (positive-nums-only lst)
(if (empty? lst) '()
(append (if (>= (car lst) 0 )
(list (car lst))
'())
(positive-nums-only (cdr lst)))
)
)
另一方面,这种递归对计算机来说可能代价高昂。我会使用尾递归,像这样:
(define positive-nums-only-tail
(λ (lst r)
(cond ((empty? lst) (reverse r))
((positive? (car lst))
(positive-nums-only-tail (cdr lst)
(cons (car lst) r)))
(else (positive-nums-only-tail (cdr lst) r))
)
)
)
我写了一个小函数,它接受一个列表和 returns 一个仅由正数组成的列表。这一切都很好,但由于某种原因,它正在颠倒顺序。下面有更多信息。有人可以告诉我这是否正常,或者我是否漏写了什么?提前谢谢你。
(define (positive-nums-only lst)
(if (empty? lst)
'()
(append (positive-nums-only (cdr lst))
(if (>= (car lst) 0)
(list (car lst))
'()))))
(positive-nums-only '(1 2 -4 90 -4))
上面的测试用例returns'(90 2 1)
你试过反转追加吗?
(define (positive-nums-only lst)
(if (empty? lst)
'()
(append (if (>= (car lst) 0) (list (car lst)) '())
(positive-nums-only (cdr lst)))))
个人觉得这样写比较自然:
(define (positive-nums-only lst)
(if (empty? lst)
'()
(let ((rest (positive-nums-only (cdr lst))))
(if (>= (car lst) 0)
(cons (car lst) rest)
rest))))
你没有弄错,程序正在按照你的要求进行。
看,程序先完成递归调用,然后再解析 if
语句。这会导致 (list ... )
从最后一个正元素开始列出,在本例中它将是 90
。
更改代码顺序将产生您想要的结果。
(define (positive-nums-only lst)
(if (empty? lst) '()
(append (if (>= (car lst) 0 )
(list (car lst))
'())
(positive-nums-only (cdr lst)))
)
)
另一方面,这种递归对计算机来说可能代价高昂。我会使用尾递归,像这样:
(define positive-nums-only-tail
(λ (lst r)
(cond ((empty? lst) (reverse r))
((positive? (car lst))
(positive-nums-only-tail (cdr lst)
(cons (car lst) r)))
(else (positive-nums-only-tail (cdr lst) r))
)
)
)