,所以我的输入是某个列表l,该功能的目的是采取所有阳性,并仅以这些正值为单位。这就是我目前得到的:
(define (positives l)
(define (poscheck l)
(cond ((negative? (car l)) '())
((null? l) '())
(else (poscheck (cdr l)))))
(list (poscheck l)))
出于某种原因,它一直告诉我检查时它被给出了一个空列表(CAR L)。我不确定该错误所在。修复此代码的任何帮助将不胜感激。
,所以我喜欢先检查简单的东西。
(positives '()) ; ==> ERROR
因此,对于一个空列表,您首先检查第一个元素是否为负。但是必须清楚检查一个空列表,然后才能进一步检查第一个元素是否smo。
(positives '(-1 2 3)) ; ==> (())
如果第一个元素为负,则助手停止并且完成了。.不应该跳过第一个元素吗?
最后一个观察结果是,在一个数字为正的情况下,您应该通过将元素固定到第三元素的其余部分来将其添加到答案中。现在,如果实际上该元素为负,应该发生的事情应该发生。
没有理由将结果包裹在list
中。如果poscheck
返回(1 2 3)
,则positives
将使它成为((1 2 3))
。
要将其包裹起来,应该在填充的...
中看起来像这样的东西:
(define (positives lst)
(cond ((null? lst) '())
((negative? (car lst)) (positives ...))
(else (cons ... (positives ...)))))
从技术上讲,这将零视为正。通过在最后两个项中切换位置并使用positive?
,它将省略零。
第一个答案效果很好,但是:
;; 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中的我们而言)。
希望您对您有所帮助,如果您对问!
使用named let
可能有助于阐明仅获得阳性的过程(添加了内联注释):
(define (onlyPositives L)
(let loop ((L L) ; start with full list
(ol '())) ; and an empty outlist
(cond
[(empty? L) ; if end of list reached, return outlist (reversed since cons adds at head of list);
(reverse ol)]
[(positive? (car L)) ; if first item is positive, loop with rest of list and first item added to outlist;
(loop (cdr L)
(cons (car L) ol))]
[else ; else loop with rest of list without adding item to outlist;
(loop (cdr L)
ol)]
)))