【问题标题】:Stepping through foldr逐步通过文件夹
【发布时间】:2016-03-02 04:08:42
【问题描述】:

如何在球拍中一步一步完成?我写了一段代码,它似乎工作得很好。但是,我不明白。

(来源:uwaterloo CS 2015 秋季作业 09,应于 11 月 24 日到期)

问题是:编写一个函数unique-fn,它使用一个列表和一个谓词相等函数并产生相同的列表 这样根据提供的相等谓词删除所有重复项。不能使用排序或递归。例如,

 (check-expect (unique-fn '(3 1 3) =) '(3 1))

 (check-expect (unique-fn '(1 1.05 2 1.2) 
                          (lambda (x y) (> 0.1 (abs (− x y))))) 
              '(1 2 1.2))

这是我的代码,但我不明白如何:

(define (unique-fn list-of-elm pred?)
(foldr (lambda (x y)
       (cons x (foldr (lambda (a b) 
               (cond[(pred? x a) b]
                    [else (cons a b)])) empty y)))
     empty list-of-elm))

我真的不知道如何解决这个问题。我知道 foldr 从右边折叠,但是这个“嵌套”的 foldr 实际上是如何工作的?有什么想法吗?

【问题讨论】:

  • 因为您的代码中的 foldr 会调用自身。它正在使用递归,不符合您问题中所述的要求。
  • (foldr f z [a,b,...,n]) == (f a (f b (...(f n z)...))).

标签: functional-programming scheme racket


【解决方案1】:

最好将foldr 过程参数作为采用形式参数(x acc) 而不是(x y) 在这种情况下,您正在累积一个列表,因此一个缺点是适合该过程的开放。

但是我不认为这是一个 foldr,我认为它是一个 foldl。如果它是一个折叠器,在调用 prodedure 之前,您将在 acc 中拥有 1.05,并将保留 1.05 并丢弃 1。逻辑实际上是从左到右读取的,最左边的副本被保留,右边的副本被删除。

(define (unique-fn list-of-elm pred?)
 (reverse ;for right result order
   (fold (lambda (acc x)
            (if (member x acc pred?) ;member optionally accepts a predicate
                acc
                (cons x acc)))
         empty 
         list-of-elm)))

【讨论】:

    【解决方案2】:

    您是否考虑过使用 Racket 的步进器?在我看来,您的代码应该可以在其中一种教学语言中正常运行,也许是中级语言。步进器应该向您展示程序评估的每一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2017-07-21
      • 2020-01-14
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      相关资源
      最近更新 更多