计划编程练习

时间:2017-07-16 04:38:11

标签: lambda functional-programming scheme racket

我是计划的新手,我试图解决提议的练习。我很感激你关于如何解决它的想法,这是练习:

编写程序" 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!")

知道如何实现它吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:-1)

您可以使用map解决此问题。想想你是否拥有odd?add1sub1这三个函数,并希望使用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 '() )))