有人熟悉这个吗?
编写一个过程,将计算 f 和正整数 n 的过程作为输入,并返回计算 f 的第 n 次重复应用的过程。该程序应该能够按如下方式使用:
((repeated square 2) 5) 625
我知道我为函数组合创建的以下代码将有助于使解决方案更简单,但我不确定从这里去哪里:
(define (compose f g) (lambda (x) (f (g x))))
好吧,你可能想要这样的东西,对吧?
((repeated square 3) 5)
-> (square ((repeated square 2) 5))
-> (square (square ((repeated square 1) 5)))
-> (square (square (square ((repeated square 0) 5))))
-> (square (square (square (identity 5))))
(不知道identity
Scheme里有没有预定义,没有的话写起来也方便。)
现在,这不是直接可重现的,因为您不能repeated
用任意东西神奇地将调用之外的代码封装起来。但是,当使用 重写时,这些缩减步骤是什么样的compose
?你能在生成的步骤列表中找出一个模式并重现它吗?
(define (repeated f n)
(if (zero? n)
identity
(lambda (x) ((repeated f (- n 1)) (f x)))))
或者,如果您坚持使用“撰写”:
(define (repeated f n)
(if (zero? n)
identity
(compose (repeated f (- n 1)) f)))