scheme - 迭代过程中的固定数量和固定规则
问题描述
我正在阅读SICP的 1.2 程序及其生成的过程。
计算阶乘的线性迭代过程
(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)))
迭代:
产品<---计数器·产品
计数器<---计数器+1
然后说明:
在每一步,对于任何 =n=,我们只需要跟踪变量 product、counter 和 max-count 的当前值。我们称之为迭代过程。一般来说,迭代过程是这样一个过程,其状态可以通过
1) 固定数量的状态变量,
2) 以及描述在过程从状态移动到状态时如何更新状态变量的固定规则
3) 和一个(可选的)结束测试,它指定进程应该终止的条件。在计算 n! 时,所需的步数随 n 线性增长。这样的过程称为线性迭代过程。
参考 1) 固定数量 2) 固定规则和 3) 可选结束测试
当我可以确认那max-count
是 3) 可选的结束测试。但我不确定修复号和固定规则。
如果固定数字是counter
固定规则product=counter * product
,在这种情况下,计数器不是固定的,它是计数器 += 1
如果定数是计数器,而定规则counter + 1
是
适当的固定数量和固定规则是什么?
解决方案
在这种情况下,“固定数量”的变量意味着有有限数量的变量,在流程开始时预先知道 - 我们只有其中三个:product
counter
和max-count
. 这与递归过程形成对比,递归过程将在堆栈帧中的每个过程调用中拥有这三个变量的新副本。
第二点是相关的:“固定规则”是指在过程的递归步骤中,我们只是简单地调用fact-iter
,执行之后就没有什么可做的了:也就是说,它在尾部位置。
推荐阅读
- xml - 使用 XPath 生成 XML 文件
- https - 无法在 Istio 网关中设置 https
- gnupg - 升级后 GPG 无法再解密文件
- java - Deeplearning4j (DL4J) 低精度、召回率和 F1
- sql - SQL - 带重置的窗口计数
- c# - 为什么我的循环混合了第一个循环和最终循环的第一个输入
- c# - Google Maps Geocode API 以编程方式返回 NO_RESULTS,但在浏览器中返回具有相同 URL 的结果
- angular - 如何从 Ionic 3 中的 WordPress rest api 访问 JSON 值
- java - 没有合适的添加方法
- google-directions-api - Google 路线 OVER_QUERY_LIMIT