跳转到内容

编程的科学/一点点这样,一点点那样

来自Wikibooks,开放世界中的开放书籍

在上一章中,您被介绍了变量的概念。变量是计算机内存中一个可以存储值的位置

   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未定义。这是解释器告诉我们忘记使用vary预留位置的方式。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;
       }

请注意,我们传入wdw的值,然后计算比率。这使我们能够非常轻松地尝试各种各样的值

   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如何变化。制作一个包含yxdy/dx的表格。

8. 上一个问题有一个恒定的变化率。然而,因变量的变化率通常会随着自变量的变化而变化。让我们以正方形面积的函数为例,。首先,当x从2变到4时,面积的变化是多少?绘制此情况的草图,标记dydx。当x从2变到3、2变到2.5、2变到2.1和2变到2.01时,执行相同的操作。你观察到了什么?尝试相同的事情,但现在从x = 4开始。关键在于,面积的变化率本身取决于长度。表达yx变化之间关系的x函数称为导数dy/dx。根据你的实验,的导数是什么?

9. 护甲的减伤率为,其中。减伤率相对于护甲和敌方等级的增长情况如何?

  1. 此图使用 Cheesy ASCII (tm) Graphics(快速加载)绘制。
  2. 当我们将某些东西视为常数、不变的东西时,我们硬编码它。
  3. 你可以相信整数,因为它们是精确的。但你永远不应该完全相信实数,因为它们是近似值。摇摆实数的精度只有15位有效数字。


你能低到什么程度? · 最简单的事情

华夏公益教科书