recursion - 一个函数怎么可能调用自己
问题描述
我知道递归,但我不知道它怎么可能。我将使用下面的例子来进一步解释我的问题。
(def (pow (x, y))
(cond ((y = 0) 1))
(x * (pow (x , y-1))))
上面的程序是用 Lisp 语言编写的。我不确定语法是否正确,因为我在脑海中想出了它,但它会做。在程序中,我定义了函数 pow,并在 pow 中调用自身。我不明白它是如何做到这一点的。据我所知,计算机必须在定义函数之前对其进行完全分析。如果是这种情况,那么当我使用 pow 时,计算机应该会给出一条未定义的消息,因为我在它被定义之前就使用了它。我所描述的原理是当您在 x = x + 1 中使用 x 时起作用的原理,而 x 之前没有定义。
解决方案
据我所知,计算机必须在定义函数之前对其进行完全分析。
当编译器看到定义了一个函数 POW 时,它会告诉自己:现在我们正在定义函数 POW。如果它在定义中看到对 POW 的调用,那么编译器会对自己说:哦,这似乎是对我当前正在编译的函数的调用,然后它可以创建代码来进行递归调用。
推荐阅读
- javascript - 我的用户如何按回车键或单击按钮提交并被重定向?
- java - 验证用户输入的整数时无法转换类型
- python - 如何创建一个熊猫数据框,其中包含 2 个数据框,一个作为列,一个作为行
- python - 如何在django中自定义一个onetomany关系的序列化器数据
- node.js - ES6/TypeScript 动态导入 - 由于静态导入(Nodejs CLI)而导致启动时间缓慢
- python - 如何生成满足某些条件的三个随机整数?
- reactjs - react-hook-form 的 DefaultValues 未将值设置为 React JS 中的输入字段
- firebase - React Native:使用哪个 firebase 存储 npm 包?
- javascript - Suitescript2.0 中的 Netsuite record.save 返回 200OK 但未创建记录(但同样适用于 SuiteScript1.0)
- apache-kafka - 为什么消费者获取消息时 Kafka 主题队列不为空?