计划编程练习
问题描述:
我是新的计划,我试图解决一个建议的练习。我感谢你的想法,如何解决它,这是练习:计划编程练习
编写一个过程“filteredmap”,采用2个函数,并应用第一个函数时谓词(也作为参数传递)返回#t并在谓词产生#f时应用第二个函数。
例子:
> (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!")
任何想法如何实现它?谢谢你的帮助!
答
您可以使用map
来解决。想想看你是否有odd?
,add1
,sub1
这三个函数,并想用map
代替实现相同的结果,那么如何构造你作为第一个参数传递的lambda?
当您知道您可以使用它来制作filteredmap
时,您只需使用map
就可以使用相同的方式,但通过使用您命名为3部分的变量来代替。十分简单。
答
您可以使用诸如折叠权的高阶函数,您可以使用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 '())))
'filteredmap p g h = map([x] => p x?g x:h x)'。 –
你真的应该试着自己解决你的功课,然后再问别人为你做。这不是Stack Overflow的原因,你只是在欺骗自己而不是学习。 –