编程的科学/一点点这样,一点点那样
在上一章中,您被介绍了变量的概念。变量是计算机内存中一个可以存储值的位置
sway> var x = 1000000; INTEGER: 1000000 sway> x; INTEGER: 1000000
这里,我将该位置命名为x,并在该位置存储了数字1000000。一旦我预留了该位置,我就可以通过为变量赋值新值来更改那里的值。这是一个例子
sway> x = 42; INTEGER: 42 sway> x; INTEGER: 42
请注意,我这次没有使用单词var这次。当我使用var时,表示为我预留一个新的位置。当我未使用var时,表示更新之前预留的位置。
要了解有关赋值的更多信息,请参阅Sway 赋值。
如果我们尝试在不首先预留位置的情况下更新位置会发生什么?
sway> y = 3; EVALUATION ERROR: :assignError stdin,line 3: assignment: variable y is undefined
我们收到一条消息,指出y未定义。这是解释器告诉我们忘记使用var为y预留位置的方式。Sway 知道我们没有定义变量,因为它在当前环境中查找它,如果失败,则在上下文环境中查找,如果失败,则在上下文的上下文中查找,依此类推,直到它用完要查找的位置。
变量一词暗示值可以变化,这正是我们对x所做的;我们改变了它的值。在某些编程语言中,存在名为常量的类似的野兽,一旦创建,您就无法更改它们。在 Sway 中,本身没有常量。如果我们需要常量,我们将使用变量代替,但我们将承诺不更改变量的值。为了提醒我们不应更改其值,我们将在命名变量时使用大写字母(主要是)
sway> var PI = 3.14159; REAL_NUMBER: 3.1415900000
做出此承诺被称为遵循约定。请注意,变量名称可以(并且通常应该)超过单个字母。另请注意,CME 第 3 章中的 SPT 使用字母表开头的字母表示常量,使用字母表结尾的字母表示变量。这是一个不同的约定。
这是一个比 CME[1]中的问题稍微简单一点的问题
+ + + + + + + + + + + + + + + + + + + + + + h = w/2 + + + + + + + + + + + + + + + + + + + + w
考虑一个宽高相关的矩形。假设我们稍微增加宽度。假设新高度仍然是新宽度的一半,高度会发生什么变化?由于高度是根据宽度计算的,因此我们说宽度是自变量,高度是因变量。首先,让我们定义一个函数,该函数根据宽度w给出高度h
function h(w) { w / 2.0; }
请注意,当我们编写这样的函数时,因变量几乎总是函数的名称,自变量是形式参数的名称。使用此规则来帮助您定义所需的函数。
我们可以测试一下我们的新函数
sway> h(100); REAL_NUMBER: 50.0000000
这证实了我们的猜想,如果宽度为 100 个单位,则高度必须为 50 个单位。
微积分通常关注的是给定自变量变化时因变量的变化,特别是这两个变化的比率。
现在,让我们使用宽度的小变化来计算上述矩形的比率
sway> var w = 100; //width sway> var dw = 0.01; //change in width sway> var dh = h(w + dw) - h(w); //change in height
高度的变化只是新高度减去旧高度。现在我们可以计算比率了
sway> dh / dw; REAL_NUMBER: 0.5000000000
微积分还关注的是,这个比率是否会随着不同数量的变化或自变量的不同值而变化?回答这些问题的懒人方法是,您猜对了,编写一个函数来完成这项工作。
function ratio(w,dw) { var dh = h(w + dw) - h(w); dh / dw; }
请注意,我们传入w和dw的值,然后计算比率。这使我们能够非常轻松地尝试各种各样的值
sway> ratio(40,0.01); REAL_NUMBER: 0.5000000000 sway> ratio(40,0.0001); REAL_NUMBER: 0.5000000000 sway> ratio(20,0.0001); REAL_NUMBER: 0.5000000000
此比率函数非常有用!我们看到的比率似乎从未改变。但是,假设我们现在开始查看宽高之间关系不同的矩形。突然之间,我们的比率函数看起来没那么有用了。这是因为我们硬编码了高度函数。[2] 我们可以通过将高度函数作为第三个参数传入来解决此问题。现在我们可以轻松地尝试新的高度函数。通过这样做,我们使比率计算函数更通用。
function ratio(w,dw,h) { var dh = h(w + dw) - h(w); dh / dw; }
它应该以同样的方式工作
sway> ratio(40,0.01,h); REAL_NUMBER: 0.5000000000 sway> ratio(40,0.0001,h); REAL_NUMBER: 0.5000000000 sway> ratio(20,0.0001,h); REAL_NUMBER: 0.5000000000
让我们尝试一个不同的高度函数
function g(w) { w * w; }
使用此高度函数,高度g随着宽度的平方而增长。比率现在会产生什么?让我们尝试一个宽度和越来越小的变化
sway> ratio(100,1,g); INTEGER: 201 sway> ratio(100,0.1,g); REAL_NUMBER: 200.10000000 sway> ratio(100,0.01,g); REAL_NUMBER: 200.01000000 sway> ratio(100,0.001,g); REAL_NUMBER: 200.00100000
很明显,如果宽度的变化变得无限小,则宽度为 100 时的比率将为 200。
现在让我们尝试不同的宽度和越来越小的变化
sway> ratio(200,1,g); INTEGER: 401 sway> ratio(200,0.1,g); REAL_NUMBER: 400.10000000 sway> ratio(200,0.01,g); REAL_NUMBER: 400.01000000 sway> ratio(200,0.001,g); REAL_NUMBER: 400.00100000 sway> ratio(200,0.0001,g); REAL_NUMBER: 400.00009998
对于这个新的宽度 200,比率似乎收敛于 400。此外,对于最后的测试,我们得到的值有点出乎意料。在处理实数时,这应该对您是一个警告。[3]
对于高度函数g,我们看到不同的起始宽度会产生不同的比率。大量的微积分是为了解释为什么这些比率会发生变化。此外,这个计算比率的过程被称为求导数。
所有公式均使用小学算术优先级编写。
1. 在定义函数时,我们使用什么变量名作为形式参数有关系吗?
2. 绘制一个带标签的矩形的图片,使高度为自变量,保持高度是宽度的一半的关系。
3. 在函数比率中,dh 由计算。如果我们假设) 等于),则dh 为或简化为。定义一个名为ratio2的新函数来测试此假设是否有效。
4. 对于非常小的变化,哪个函数更好?为什么?
5. 考虑一个面积永不改变的矩形。也就是说,如果宽度增加,高度会减小以进行补偿,以便矩形的面积保持不变。定义一个函数,该函数根据宽度和面积计算此矩形的高度。
6. 我们是否观察到与函数g相同的比率行为?
7. “变化是永恒的”,但这并不意味着变化必须是恒定的。我们大多数人都习惯了恒定变化率的概念。例如,直线描述的高度与距离的变化,例如。使用比率函数来探索当x变化时y如何变化。制作一个包含y、x和dy/dx的表格。
8. 上一个问题有一个恒定的变化率。然而,因变量的变化率通常会随着自变量的变化而变化。让我们以正方形面积的函数为例,。首先,当x从2变到4时,面积的变化是多少?绘制此情况的草图,标记dy和dx。当x从2变到3、2变到2.5、2变到2.1和2变到2.01时,执行相同的操作。你观察到了什么?尝试相同的事情,但现在从x = 4开始。关键在于,面积的变化率本身取决于长度。表达y和x变化之间关系的x函数称为导数,dy/dx。根据你的实验,的导数是什么?
9. 护甲的减伤率为,其中。减伤率相对于护甲和敌方等级的增长情况如何?
- ↑ 此图使用 Cheesy ASCII (tm) Graphics(快速加载)绘制。
- ↑ 当我们将某些东西视为常数、不变的东西时,我们硬编码它。
- ↑ 你可以相信整数,因为它们是精确的。但你永远不应该完全相信实数,因为它们是近似值。摇摆实数的精度只有15位有效数字。