【发布时间】:2021-05-17 05:45:35
【问题描述】:
我遇到了这个关于如何使用可变参数过程来实现任意数量函数的组合的程序
(define compose-n
(lambda fs
(cond
[(null? fs) identity]
[else (lambda (x)
((first fs) ((apply compose-n (rest fs)) x)))])))
但是,当我删除最后一行的apply 并手动执行应用程序时,
(define removed-compose-n
(lambda fs
(cond
[(null? fs) identity]
[else (lambda (x)
((first fs) ((removed-compose-n (rest fs)) x)))])))
这开始循环并消耗所有内存,使我的计算机崩溃。此外,当我尝试打印出fs 以查看发生了什么时
(define removed-compose-n
(lambda fs
(printf "fs : ~s\n" fs)
(cond
[(null? fs) identity]
[else (lambda (x)
((first fs) ((removed-compose-n (rest fs)) x)))])))
我很惊讶
fs : (#<procedure:id>)
fs : (())
fs : (())
fs : (())
fs : (())
fs : (())
fs : (^C
; user break [,bt for context]
这向我表明(rest fs) 的计算结果为'(()),这就是导致removed-compose-n 循环的原因,但compose-n 逃脱了这一点,因为(apply compose-n '(())) 与(compose-n '()) 相同,这与递归/第一个 cond 子句的基本情况。
为什么(rest fs) 评估'(()) 而不是'(),导致removed-compose-n 循环?还是我完全错过了循环其他内容的原因?
【问题讨论】:
标签: recursion racket infinite-loop