方案的新手,坚持这一个

时间:2015-11-04 21:37:03

标签: functional-programming scheme

编写一个方案函数class TallBar: UINavigationBar { override func sizeThatFits(size: CGSize) -> CGSize { var size = super.sizeThatFits(size) size.height += 20 return size } } ,它将谓词和整数列表作为参数。该函数应该将列表中满足谓词的每个项乘以2并添加结果。例如::

workit

您不能使用(workit even? '(1 2 3 4 5 6)) ==> 4+8+12=24 (workit odd? '(1 2 3 4 5 6)) ==> 2+6+10=18 mapremove或任何其他更高阶的功能。

有人至少可以帮助我抢先一步吗?决定学习我有兴趣申请的工作计划......任何帮助都会很棒!感谢

2 个答案:

答案 0 :(得分:1)

首先定义even?

(define (even? x) (= 0 (modulo x 2)))

您可以使用而不是甚至

来定义odd?
(define (odd? x) (not (even? x)))

您的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

  • 如果我们正在迭代的列表是empty?,我们就完成了,所以请返回sum
  • 否则,如果(predicate x)为真,请将(* 2 x)添加到sum并继续迭代
  • 否则,谓词为false,不要改变此迭代的总和

我选择使用辅助iter函数来实现正确的tail recursion。这允许workit在恒定的空间中运行。

输出

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

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

答案 1 :(得分:0)

  • 如果列表中没有元素,则列表的工作量是基础 值。

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

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

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