单步折叠

时间:2015-11-27 23:49:49

标签: functional-programming scheme racket

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

(来源:uwaterloo CS Fall 2015 Assignment 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实际上工作?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

然而,我不认为这是一个折叠者,我认为它是一个折叠。如果它是一个折叠器,你在调用该程序之前会在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)))

答案 1 :(得分:0)

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