方案:返回正值列表

时间:2017-03-07 00:55:09

标签: scheme racket

所以我的输入是一些列表l,该函数的目标是获取所有的积极因素并使用这些正值创建一个新列表。这就是我现在所拥有的:

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

出于某种原因,它一直告诉我在检查时(车辆l)给出了一个空列表。我不确定它正在为错误做些什么。任何有关修复此代码的帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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?,它将省略零。

答案 1 :(得分: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,没有其他奇怪的功能(对于我们在DrRacket中的新手)。

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

答案 2 :(得分:1)

使用(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)] ))) 可能有助于澄清只获得积极的过程(添加内联评论):

'limit' : 50, 'offset': 50,