我是计划的新手,我试图解决提议的练习。我很感激你关于如何解决它的想法,这是练习:
编写程序" filteredmap"当一个谓词(也作为参数传递)返回#t并且当谓词产生#f时应用第二个函数时,它接受2个函数并应用第一个函数。
示例:
> (filteredmap even? (lambda (x) (+ x 1))
(lambda (x) (* x 2))
(list 1 2 3 4 5 6 7 8 9 10))
(2 3 6 5 10 7 14 9 18 11)
> (filteredmap even? (lambda (x) "yes, yes, even!")
(lambda (x) "oh no!")
(list 1 2 3 4 5 6 7 8 9 10))
("oh no!" "yes, yes, even!" "oh no!" "yes, yes, even!" "oh no!" "yes, yes,
even!" "oh no!" "yes, yes, even!" "oh no!" "yes, yes, even!")
知道如何实现它吗?谢谢你的帮助!
答案 0 :(得分:-1)
您可以使用map
解决此问题。想想你是否拥有odd?
,add1
和sub1
这三个函数,并希望使用map
来获得相同的结果,你将如何构造你传递的lambda作为第一个论点?
如果您知道可以使用它来filteredmap
以相同的方式使用map
,而是使用已命名为3部分的变量。十分简单。
答案 1 :(得分:-1)
您可以使用高阶函数(例如右侧折叠),您可以使用lambdas使用地图,或者使用迭代解决方案在列表中获取答案,该列表是"向后"通过读取列表的第一个元素并使用正确的映射和累加器作为cdr调用cons
,因此您最后需要调用reverse
。这是我的解决方案:
(define (filteredmap predicate fun1 fun2 items)
(define (fm-iter pred f1 f2 lst acc)
(cond ((null? lst) acc)
((pred (car lst)) (fm-iter pred f1 f2 (cdr lst) (cons (f1 (car lst)) acc)))
(else (fm-iter pred f1 f2 (cdr lst) (cons (f2 (car lst)) acc)))))
(reverse (fm-iter predicate fun1 fun2 items '() )))