2017-07-16 97 views
-6

我是新的计划,我试图解决一个建议的练习。我感谢你的想法,如何解决它,这是练习:计划编程练习

编写一个过程“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!") 

任何想法如何实现它?谢谢你的帮助!

+0

'filteredmap p g h = map([x] => p x?g x:h x)'。 –

+0

你真的应该试着自己解决你的功课,然后再问别人为你做。这不是Stack Overflow的原因,你只是在欺骗自己而不是学习。 –

回答

-1

您可以使用map来解决。想想看你是否有odd?,add1,sub1这三个函数,并想用map代替实现相同的结果,那么如何构造你作为第一个参数传递的lambda?

当您知道您可以使用它来制作filteredmap时,您只需使用map就可以使用相同的方式,但通过使用您命名为3部分的变量来代替。十分简单。

-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 '())))