SICP 1.20经验
1.20 两者之间的主要区别是,使我们明白的操作顺序。
网上找一些答案,都死了扩大。 我们所从事的IT的。 展开搞死人IT实践。
首先考虑应用程序
我们得到
gcd(206, 40) -> gcd(40, 6) -> gcd(6, 4) -> gcd(4,2)->gcd(2,0) 总共4次递归调用,每次递归做一次取余数运算。
那么。 正则序列怎么知道呢? 一种办法是全然按步骤做法。 这是计算机思维。 搞IT的就要换数学思维。
先看看规律。 206-> 40-> 6-> 4 -> 2 存在某种序列关系。我们设定一个序列A。表示求该数所需的余数次数,那么必定有
A[0] = 0, A[1] = 0, A[2] = 1, A[3] = 1+ A[1] + A[2], A[n] = 1 + A[n-1] + A[n-2] 为什么?
由于 An = r(A[n-1], A[n-2]) 依照正则求值规则,我们先要展开A[n-1]。A[n-2], 最后再计算A[n]。必定有该公式。
接下来考虑怎样用A来求答案。
通过代码能够知道。 前面的递归。 仅仅有if 里用到了b。 最后一次递归, 用到了a
所以扩大的数
A[1] + A[2] + A[3] + A[4] + A[5] + A[4] = 0 + 1 + 2 + 4 + 7 + 4 = 18次要
相同。由A不管两个数可以得到典型的扩展。