【问题标题】:Scheme: Return a list of positive values方案:返回正值列表
【发布时间】:2023-03-25 17:50:01
【问题描述】:

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

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

由于某种原因,它一直告诉我在检查 (car l) 时给出了一个空列表。我不完全确定它对错误的了解。任何有关修复此代码的帮助将不胜感激。

【问题讨论】:

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

标签: scheme racket


【解决方案1】:

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

(positives '()) ; ==> ERROR

因此,对于一个空列表,您首先检查第一个元素是否为负。但是必须清楚地检查一个空列表,然后才能进一步检查第一个元素是否为 smoething。

(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?,它将省略零。

【讨论】:

    【解决方案2】:

    第一个答案很好,但是:

    ;; 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 中的新手而言)。

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

    【讨论】:

      【解决方案3】:

      使用named let 可能有助于阐明仅获得肯定的过程(添加了内联 cmets):

      (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)]
            )))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多