Scheme:返回一个正值列表

Scheme:返回一个正值列表,scheme,racket,Scheme,Racket,所以我的输入是一些列表l,函数的目标是获取所有的正值,并用这些正值创建一个新的列表。这是我目前得到的: (define (positives l) (define (poscheck l) (cond ((negative? (car l)) '()) ((null? l) '()) (else (poscheck (cdr l))))) (list (poscheck l))) 出于某种原因,它一直告诉我,它在检查(l车)时给出了一个空列表

所以我的输入是一些列表l,函数的目标是获取所有的正值,并用这些正值创建一个新的列表。这是我目前得到的:

(define (positives l)
  (define (poscheck l)
    (cond ((negative? (car l)) '())
          ((null? l) '())
          (else (poscheck (cdr l)))))
(list (poscheck l)))

出于某种原因,它一直告诉我,它在检查(l车)时给出了一个空列表。我不太确定这是怎么回事。如果您能帮助修复此代码,我们将不胜感激。

因此我想先检查一下简单的事情

(positives '()) ; ==> ERROR
因此,对于空列表,首先检查第一个元素是否为负。。但在进一步检查第一个元素是否为Smething之前,必须明确检查空列表

(positives '(-1 2 3)) ; ==> (())
如果第一个元素为负,则辅助对象停止并完成。。它不应该跳过第一个元素吗

最后一个观察结果是,如果一个数字是正的,你应该把它加到答案中,把这个元素看成是其余元素的递归。它现在所做的是,如果元素实际上是负的,那么应该发生什么

没有理由将结果包装在
列表中。如果
poscheck
返回
(1233)
,则
正数将使其成为
((1233))

总而言之,它应该是这样的,并填入

(define (positives lst)
  (cond ((null? lst) '())
        ((negative? (car lst)) (positives ...))
        (else (cons ... (positives ...)))))

从技术上讲,这假设零为正。通过在最后两个术语中切换位置并使用
正数?
它将省略零。

因此我想先检查简单的事情

(positives '()) ; ==> ERROR
因此,对于空列表,首先检查第一个元素是否为负。。但在进一步检查第一个元素是否为Smething之前,必须明确检查空列表

(positives '(-1 2 3)) ; ==> (())
如果第一个元素为负,则辅助对象停止并完成。。它不应该跳过第一个元素吗

最后一个观察结果是,如果一个数字是正的,你应该把它加到答案中,把这个元素看成是其余元素的递归。它现在所做的是,如果元素实际上是负的,那么应该发生什么

没有理由将结果包装在
列表中。如果
poscheck
返回
(1233)
,则
正数将使其成为
((1233))

总而言之,它应该是这样的,并填入

(define (positives lst)
  (cond ((null? lst) '())
        ((negative? (car lst)) (positives ...))
        (else (cons ... (positives ...)))))

从技术上讲,这假设零为正。通过在最后两个术语中切换位置并使用
正数?
可以省略零。

第一个答案很好,但是:

;; poscheck function. Use it to assign positive lists from another lists.
;; example (define positives (poscheck '(1 2 -4 -5 0 3) '()))
;; positives -> '(3 2 1)
(define (poscheck l r)
  (cond ((empty? l) r)
        ((positive? (car l)) (poscheck (cdr l) (cons (car l) r )))
        (else (poscheck (cdr l) r))))
在这个答案中,我使用了尾部递归,这基本上意味着在许多递归调用中使用一个变量来存储最终结果

我们想考虑一下最坏的情况是什么,让它成为
cond
函数中的第一个选项,在这种情况下,可能发生的最坏情况(使
car
失败)是列表为空(检查
(car'())
的功能)。所以我们就到此为止。如果列表为空,则表示我们已检查所有项目

我们的下一个例子是当当前项
(car l)
为正时发生的情况,这意味着我们希望它出现在最终结果中,因此我们将它添加到结果存储变量中,以便在下一次递归调用中使用它,方法是

(poscheck (cdr l) (cons (car l) r ))
这将调用包含列表其余部分的函数,但保存我刚才检查的内容

最后一种情况是当当前项在最终列表中不需要时发生的情况,因此我们只是通过调用函数来忽略它,该函数包含列表的其余部分,并且相同的结果存储变量,而不对其进行修改。我们通过以下方式做到这一点:

(poscheck (cdr l) r)
这就差不多了,没有
map
,没有
filter
,没有其他奇怪的功能(对于我们DrRacket的新手来说)


希望这对你有帮助,如果你有任何疑问,请不要犹豫

第一个答案很好,但是:

;; poscheck function. Use it to assign positive lists from another lists.
;; example (define positives (poscheck '(1 2 -4 -5 0 3) '()))
;; positives -> '(3 2 1)
(define (poscheck l r)
  (cond ((empty? l) r)
        ((positive? (car l)) (poscheck (cdr l) (cons (car l) r )))
        (else (poscheck (cdr l) r))))
在这个答案中,我使用了尾部递归,这基本上意味着在许多递归调用中使用一个变量来存储最终结果

我们想考虑一下最坏的情况是什么,让它成为
cond
函数中的第一个选项,在这种情况下,可能发生的最坏情况(使
car
失败)是列表为空(检查
(car'())
的功能)。所以我们就到此为止。如果列表为空,则表示我们已检查所有项目

我们的下一个例子是当当前项
(car l)
为正时发生的情况,这意味着我们希望它出现在最终结果中,因此我们将它添加到结果存储变量中,以便在下一次递归调用中使用它,方法是

(poscheck (cdr l) (cons (car l) r ))
这将调用包含列表其余部分的函数,但保存我刚才检查的内容

最后一种情况是当当前项在最终列表中不需要时发生的情况,因此我们只是通过调用函数来忽略它,该函数包含列表的其余部分,并且相同的结果存储变量,而不对其进行修改。我们通过以下方式做到这一点:

(poscheck (cdr l) r)
这就差不多了,没有
map
,没有
filter
,没有其他奇怪的功能(对于我们DrRacket的新手来说)


希望这对你有帮助,如果你有任何疑问,请不要犹豫

使用
命名let
可能有助于澄清只获取正面信息的过程(添加了内联注释):


使用
named let
可能有助于澄清仅获取正面信息的过程(添加了内联注释):


您是否被限制使用任何映射函数,例如?或者甚至更好,映射很好,但我们还没有讨论过过滤器。您是否受限于使用任何映射函数,例如?或者更好,地图很好,但我们还没有过滤镜。