方案:返回正值列表



,所以我的输入是某个列表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)]
      )))

最新更新