Functional programming 新的计划,坚持这一点

Functional programming 新的计划,坚持这一点,functional-programming,scheme,Functional Programming,Scheme,编写一个scheme函数workit,该函数将谓词和整数列表作为参数。函数应将列表中满足谓词的每个项乘以2,并将结果相加。例如: (workit even? '(1 2 3 4 5 6)) ==> 4+8+12=24 (workit odd? '(1 2 3 4 5 6)) ==> 2+6+10=18 您不能使用映射、删除、过滤,或任何其他高阶功能 至少有人能帮我抢先一步吗?决定学习一个我有兴趣申请的工作计划。。。。任何帮助都会很好!谢谢首先定义偶数? (define (even?

编写一个scheme函数
workit
,该函数将谓词和整数列表作为参数。函数应将列表中满足谓词的每个项乘以2,并将结果相加。例如:

(workit even? '(1 2 3 4 5 6)) ==> 4+8+12=24
(workit odd? '(1 2 3 4 5 6)) ==> 2+6+10=18
您不能使用
映射
删除
过滤
,或任何其他高阶功能


至少有人能帮我抢先一步吗?决定学习一个我有兴趣申请的工作计划。。。。任何帮助都会很好!谢谢

首先定义
偶数?

(define (even? x) (= 0 (modulo x 2)))
您可以根据非偶数定义
odd?

您的
workit
函数非常简单

(define (workit predicate xs)
  (define (iter sum xs)
    (cond ((empty? xs) sum)
          ((predicate (first xs)) (iter (+ sum (* 2 (first xs))) (rest xs)))
          (else (iter sum (rest xs)))))
  (iter 0 xs))
我定义了一个内部的
iter
函数来逐步遍历提供的数字列表
xs
,同时跟踪输出
sum

  • 如果我们正在迭代的列表是
    空的?
    ,那么我们就完成了,所以返回
    总和
  • 否则,如果
    (谓词x)
    为true,则将
    (*2x)
    添加到
    和中
    并继续迭代
  • 否则,谓词为false,请勿更改此迭代的和
我选择使用辅助
iter
功能以实现适当的功能。这允许
workit
在恒定空间中操作


输出

(print (workit even? '(1 2 3 4 5 6))) ;; => 24

(print (workit odd? '(1 2 3 4 5 6)))  ;; => 18
  • 如果列表中没有任何元素,那么列表的工作就是一些基本元素 价值观

  • 如果第一个元素满足某些条件,则列表的工作是涉及该第一个元素的某些操作的结果,以及列表其余部分的工作

  • 如果第一个元素不满足条件,那么列表的工作就是列表其余部分的工作

请注意,每次递归调用workit时(如第二和第三种情况),列表都是上一次调用中列表的剩余部分。

您的Javascript如何?或者其他函数式编程?您看过Scheme中递归函数定义的模式了吗?你能确定目前你还不清楚的是什么吗?另外,如果你的目标是学习scheme(达到某种一级近似值),那么通过免费书籍,你将获得巨大的回报:而且。非常好,强烈推荐!Li'l Schemer的优点是可以在3小时内消耗品,但SICP和HtDP要全面得多。
(print (workit even? '(1 2 3 4 5 6))) ;; => 24

(print (workit odd? '(1 2 3 4 5 6)))  ;; => 18