我从Stroustrup的书中看到了这段代码,但是我不明白它是如何工作的。 我只是不知道它如何增加“ 0、1、4、9 ...”
int archaic_square(int v) {
int total = 0;
for (int i = 0; i < v; ++i) {
total += v;
}
return total;
}
int main() {
for (int i = 0; i < 100; ++i) {
cout << i << '\t' << archaic_square(i) << '\n';
}
return 0;
}
答案 0 :(得分:1)
archaic_square
中的代码从total
开始为零,然后向其v
添加v
次(在循环中)。
根据定义,它将最终显示为:
0 + v + v + … + v
\___________/
v times
是0 + v * v
或v2
。
更明确的细节:
答案 1 :(得分:1)
从算术中还记得乘法只是重复加法(或者按照定义是重复加法)吗?这就是这里正在发生的一切。
由于v
被添加了v
次,因此它与v * v
相同,或者等于v
的平方。
答案 2 :(得分:0)
该代码通过差异方法计算平方。这是一种评估功能的替代方法,与常规的“按价值插入”方法相比,具有一些优势。它被用在Babbage的difference engine中,后者是在1800年代初设计的,用于计算对数,trig函数等至40(!)位的数学表。
基本思想是从知道如何求值的值列表开始。您可以从每个值的邻近值中减去每个值,从而为您提供第一组差异列表。然后,从其相邻的差值中减去每个差值,从而提供第二个差的列表。继续直到达到所有差值都相等的水平。对于二阶多项式(例如x ^ 2),第二个差将全部相等。对于三阶多项式,三阶差将全部相等。依此类推。
因此,要计算平方,您将得到以下结果:
Value First Difference Second Difference
0
1 1
4 3 2
9 5 2
16 7 2
25 9 2
现在您可以撤消该过程。从0的结果开始。加上第一个差(1),得出下一个结果(1)。然后,将第一差增加第二差(2),得到下一个第一差(3);将其添加到上一个结果(1),得到下一个结果(4)。然后将新的第一差异(3)增加第二差异(2),得到下一个第一差异(5);将其添加到上一个结果(4),得到下一个结果(9)。继续直到完成。
因此,仅使用第一个值(0),第一个差(1)和(恒定)第二个差(2),我们就可以生成所需的正方形列表。
当您需要结果的列表时,像这样用一个接一个的计算结果将乘法替换为加法,这在过去非常快。此外,如果一台计算机(当计算机是做繁琐的计算以产生数学的人时)犯了一个错误,那么该错误之后的所有结果也将是错误的,因此负责该项目的数学家不必提供检查每个结果的方法;抽查就足够了。
当然,计算触发函数会比较棘手,因为它们不是由多项式定义的。但是在足够小的区域上,可以用多项式近似它们。
Babbage的引擎将计算出40位数字的值,最多可达到7级差异。它机械地完成了我上面提到的步骤,以几秒钟一次的速度得出结果。巴贝奇实际上并没有建立完整的差异引擎。他的灵感来自更强大的“分析引擎”,但他也从未制造过。它将是现代数字计算机的先驱,它具有1000个40位存储单元,一个算术处理器和打孔卡来控制操作顺序。