我从考试中得到一些问题,我需要推断出以下代码的输出:
01 int foo(int a) {
02 print 'F';
03 if (a <= 1) return 1;
04 return bar(a, foo(a-1));
05 }
06
07 int bar(int x, int y) {
08 print 'B';
09 if (x > y) return baz(x, y);
10 return baz(y, x);
11 }
12
13 int baz(int x, int y) {
14 print 'Z'
15 if (y == 0) return 0;
16 return baz(x, y-1) + x;
17 }
18
19 void main() {
20 foo(3);
21 }
我的问题是哪种策略最能解决这类问题?我当然不允许使用PC 附:您可以像在c ++或正常的顺序评估中那样使用急切的评估(输出当然会有所不同,但我只对策略感兴趣),我尝试使用堆栈来解决它,每次都写出我调用的函数,但无论如何它很复杂 提前感谢您的帮助
答案 0 :(得分:3)
我会使用“自下而上”的尝试:
baz
是被调用的函数,但不调用其他函数(除了它自己)。它输出'Z'完全y + 1
次,返回代码为x*y
(每次调用后添加x
。)
bar
是“下一个更高”的函数,它输出'B'一次,并以其较低的参数作为第二个参数调用baz
- 返回码也是x*y
。
foo
是“顶级”函数(在main
之后)并且是最复杂的函数。它输出'F',不仅一次,而是a
次(因为在foo(a-1)
调用之前评估的最后bar
。bar
调用乘以{ {1}}和a
,它将乘以foo(a-1)
和a-1
等等,直到评估foo(a-2)
并返回1.因此返回码为{{1} },所以foo(1)
。
这不是一个完整的分析,例如。我们不知道人物将以何种顺序输出,但这是一个粗略的计划 - 正如你和其他人在评论中指出的那样,这就是你想要的 - 战术而不是完整的答案。 / p>
答案 1 :(得分:1)
我可能要做的是从页面左上角的main()
函数开始,记下执行的第一行,跟踪局部变量等,然后写下下一行它等等。
但是当调用一个函数时,也要向右移动一列,首先记下函数的名称和该调用的输入参数的实际值,然后用该函数中的行进行处理。
从函数返回时,向左移动并在两列之间写入返回值。
另外,为“标准输出”保留一个单独的区域,其中所有打印文本都会出现。
这些步骤应该会引导您完成大部分“像计算机一样思考”的问题。