2017-03-07 111 views
0

所以我的输入是一些列表l,并且该函数的目标是获取所有肯定的结果并用这些正值创建一个新列表。这是我目前有:Scheme:返回一个正值列表

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

出于某种原因,它不断告诉我,它检查(车L)时给了一个空列表。我不完全确定它会为错误提供什么。任何帮助修复此代码将不胜感激。

+0

你约束为使用任何映射函数如[图](HTTPS://docs.racket- lang.org/reference/pairs.html?q=Map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29)?或者甚至更好,[过滤器](https://docs.racket-lang.org/reference/pairs.html?q=Map#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%29 ._filter%29%29)? –

+0

地图很好,但我们还没有过滤过。 – Tom

回答

2

所以我喜欢首先检查简单的事情。

(positives '()) ; ==> ERROR 

所以对于一个空的列表中,您首先检查的第一个元素是负的..但在此之前,你可以进一步检查,如果第一个元素smoething一个空表必须明确进行检查。

(positives '(-1 2 3)) ; ==> (()) 

如果第一个元素是负的助手会停止并做..难道不应该只是跳过第一个元素?

最后一个观察结果是,如果一个数字是肯定的,你应该把它添加到答案中,将元素包含到剩下的elist的递归中。它现在所做的是,如果实际上元素是否定的,会发生什么。

没有理由将结果包装在list中。如果poscheck返回(1 2 3)positives将使其成为((1 2 3))

把它包起来就应该是这个样子被填充到...

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

技术上这个假设零为阳性。通过在最后两项中切换地点并使用positive?它将省略零。

+0

非常感谢! – Tom

1

第一个答案工作得很好,但是:

;; 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,没有其他的怪异功能(我们newbs在DrRacket)。

希望它对你有所帮助,如果你有任何疑问不要犹豫,在询问!

0

使用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)] 
    )))