追踪返回值(returned value)就是一行一行地跟着函数调用走到 RETURN,记录每个变量的值,并说明送回调用者的是什么。考试会给出一个函数和一次调用,要你写出返回值或输出。
本课属于程序结构模块。它会用到构建子程序中的参数,以及作用域中的局部变量。
追踪函数的方法是什么?
- **把调用的实参抄进形参。**写在第一行。
- **每个变量一列。**包括参数、局部变量和循环计数器。
- **按顺序执行每一行。**每当某个值改变,就新写一行。
- **在第一个被执行的 RETURN 处停止。**返回值就是那一刻 RETURN 所带的值。
- 说明调用者拿它做什么,例如输出。
例题
追踪下面的程序,写出输出。
FUNCTION RepeatAdd(A : INTEGER, B : INTEGER) RETURNS INTEGER
DECLARE Result : INTEGER
Result ← 0
FOR I ← 1 TO B
Result ← Result + A
NEXT I
RETURN Result
ENDFUNCTION
OUTPUT RepeatAdd(4, 3)
调用 RepeatAdd(4, 3) 使 A = 4、B = 3。循环在 I = 1、2、3 时各执行一次。
| 步骤 | A | B | I | Result |
|---|---|---|---|---|
| 调用 | 4 | 3 | 未设置 | 未设置 |
| Result ← 0 | 4 | 3 | 未设置 | 0 |
| I = 1 | 4 | 3 | 1 | 0 + 4 = 4 |
| I = 2 | 4 | 3 | 2 | 4 + 4 = 8 |
| I = 3 | 4 | 3 | 3 | 8 + 4 = 12 |
| RETURN Result | 12 |
函数返回 12,主程序输出 12。这个函数把 A 重复相加 B 次,所以算的是 A × B。核对一下:4 × 3 = 12。
最常见的错误是什么?
错误的代码:
FUNCTION SumTo(N : INTEGER) RETURNS INTEGER DECLARE Total : INTEGER Total ← 0 FOR I ← 1 TO N Total ← Total + I RETURN Total NEXT I ENDFUNCTION写代码的人以为
SumTo(4)会返回 1 + 2 + 3 + 4 = 10。
RETURN 放在了循环里面。第一圈 I = 1,Total 变成 1,RETURN 立刻结束函数。所以 SumTo(4) 返回的是 1。
纠正方法是把 RETURN 移到 NEXT 之后、循环之外。这样循环会跑完四圈,Total 达到 1 + 2 + 3 + 4 = 10,返回 10。
第二个错误是调用了函数却不理会它的值。单独写一行 RepeatAdd(4, 3) 没有任何用处。应该把它存起来,例如 Answer ← RepeatAdd(4, 3),或者直接输出。
自测
1. 写出 RepeatAdd(5, 0) 返回的值。
显示答案
B 为 0,所以循环 FOR I ← 1 TO 0 一次也不会执行。Result 保持为 0,返回 0。
2. 写出 RepeatAdd(3, 4) 返回的值。
显示答案
四圈中 Result 依次是 0、3、6、9、12,所以返回 12。
3. 写出输出。
FUNCTION Larger(X : INTEGER, Y : INTEGER) RETURNS INTEGER
IF X > Y THEN
RETURN X
ELSE
RETURN Y
ENDIF
ENDFUNCTION
OUTPUT Larger(7, 12)
显示答案
X = 7,Y = 12。判断 7 > 12 为 FALSE,所以执行 ELSE 分支并返回 Y。输出是 12。
接下来学什么?
当你能追踪函数送回的值之后,就该想想:除了返回值,函数还应该做什么、不应该做什么。这正是把逻辑与输入输出分开的主题。你可以用受限伪代码追踪训练器练习,它会显示表格的每一行,也可以对照安全 Python 推理沙盒。
有些学生会追踪,却在考试中时间不够,往往是缺一套固定的做法。一对一线上 Computer Science 老师可以根据你自己的试卷帮你建立这套做法。