如何在球拍中逐步完成此操作?我写了一段代码,似乎工作得很好。但是,我不明白。
(来源: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实际上工作?有什么想法吗?
答案 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的步进器?在我看来,你的代码应该可以在其中一种教学语言中运行,也许是中级语言。步进器应该向您显示程序评估的每一步。