gpt4 book ai didi

binding - 内联定义函数和不定义函数有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:16 24 4
gpt4 key购买 nike

我正在阅读这本书 Structure and implementation of computer programs在其中一章中有一些代码用于计算数字的阶乘:

(define (factorial n)
(fact-iter 1 1 n))

(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))

在本书的前面,我了解到我可以像这样在另一个函数中定义内联函数:

(define (factorial n)
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
(fact-iter 1 1 n))

我知道使用第二种方法 fact-iter 将无法在 factorial 范围之外访问,但我想知道当我运行第二种方法时实际发生了什么factorial 的版本?

为符号 fact-iter 定义了一个新的本地绑定(bind)并创建了一个新函数,或者这个绑定(bind)只在程序编译时创建一次?

我有 Java 背景,这对我来说还不清楚。

最佳答案

它更依赖于 Scheme 的实现(策略在 SICP 的后续章节中讨论)。从概念上讲,每次调用 factorial 时都会根据您对它的第二个定义定义/编译一个新函数。但是,一个好的编译器可以转换此代码,使其更像您的第一个定义。

由于这种结构在 Scheme 中很常见(编写循环的惯用方式是命名-let 结构,它也动态定义函数),Scheme 编译器应该非常擅长做这个优化。事实上,您的示例对于优化器来说很容易处理,因为内部函数的定义实际上并不依赖于外部函数绑定(bind)的任何变量,因此它几乎可以按原样提取(可能只需要更改名称) .

关于binding - 内联定义函数和不定义函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com