有人熟悉这个吗?
编写一个作为输入的过程 计算f和a的过程 正整数n并返回 计算第n个的程序 反复应用f。该 程序应该可以用作 如下:
((repeated square 2) 5) 625
我知道我为函数组合创建的以下代码将有助于简化解决方案,但我不确定从何处开始:
(define (compose f g) (lambda (x) (f (g x))))
答案 0 :(得分:1)
嗯,你可能想要这样的东西,对吧?
((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))))
(我不知道是否在Scheme中预定义了identity
。如果没有,则很容易编写。)
现在,这不是可以直接重现的,因为你不能用任意的东西在repeated
的调用之外神奇地封闭代码。但是,使用compose
重写时这些缩减步骤是什么样的?你能在结果列表中找出一个模式并重现它吗?
答案 1 :(得分:0)
(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)))