scheme - Racket 追加意外的列表逆转

标签 scheme racket

我编写了一个小函数,它接受一个列表并返回一个仅由正数组成的列表。这一切都工作正常,但由于某种原因,它颠倒了顺序。下面有更多相关信息。有人可以告诉我这是否正常,或者我是否写错了什么?预先感谢您。

(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))

上面的测试用例返回'(90 2 1)

最佳答案

您没有犯错误,程序正在按照您的要求进行操作。

看,程序首先完成递归调用,然后再解析 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))
          )
    )
  )

关于scheme - Racket 追加意外的列表逆转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364449/

相关文章:

package - 如何为 Racket 包创建 "top-level collection"?

canvas - 如何让 canvas% 对象响应鼠标悬停?

error-handling - 方案:Why am i getting this error -assertion-violation: argument of wrong type [car] (car '())

lisp - 在 Notepad++ 中编译 lisp/scheme

functional-programming - 返回一对 - 语法错误

scheme - R5RS方案中如何 'display'多个参数

scheme - Scheme 中的递归 Pascal - 无法找到正确的算法

scheme - 如何从 2 个列表创建关联列表?

lisp - scheme什么时候评估报价?

macros - Racket 宏不起作用