如何实现Scheme过程repeatedly-apply:重复调用指定过程n次
实现Scheme的
repeatedly-apply过程 需求回顾
我们要实现的(repeatedly-apply p n)过程,接受两个参数:
- 单参数过程
p(类型为A->A) - 非负整数
n
返回一个单参数过程,该过程会将p对传入的参数重复应用n次。示例效果:
((repeatedly-apply inc 10) 2) ; 输出 12
允许使用已定义的compose过程:
(define compose (lambda (f g) (lambda (x) (f (g x)))))
基准情况采用恒等过程(lambda (x) x)。
实现思路
这是典型的递归场景:
- 基准情况:当
n=0时,无需应用任何过程,直接返回恒等过程(返回输入参数本身)。 - 递归情况:当
n>0时,把p和“重复应用p共n-1次”的过程通过compose组合。compose的逻辑是先执行n-1次重复应用,再将p作用于结果,最终实现总共n次的应用。
代码实现
; 已给定的compose过程 (define compose (lambda (f g) (lambda (x) (f (g x))))) ; 实现repeatedly-apply (define repeatedly-apply (lambda (p n) (if (= n 0) (lambda (x) x) ; 基准情况:恒等过程 (compose p (repeatedly-apply p (- n 1))))))
测试验证
运行示例代码:
((repeatedly-apply inc 10) 2) ; 计算 2 + 1*10 = 12,输出12
再测试反向场景:
((repeatedly-apply sub1 5) 10) ; 10 - 1*5 = 5,输出5
补充说明
上述实现是线性递归版本,逻辑清晰直观。如果需要优化性能,可改为迭代实现,但对于多数场景,递归版本已足够好用。核心是借助compose逐步累积过程组合,每次递归都将当前p与之前的组合过程合并,最终得到重复应用n次的目标过程。
内容的提问来源于stack exchange,提问作者Taha Yasin Erel
相关产品推荐
相关产品推荐

