我有一些考试题需要推导以下代码的输出:
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++ 中那样使用急切求值或正常顺序求值(输出当然会有所不同,但我只对策略感兴趣),我尝试使用堆栈来解决它,每次都编写我调用的函数,但无论如何它很复杂 在此先感谢您的帮助
最佳答案
我会使用“自下而上”的尝试:
baz
是被调用的函数,但不调用其他函数(除了它自己)。它输出 'Z' 恰好 y + 1
次,返回码是 x*y
(你在每次调用后添加 x
)。
bar
是“next higher”函数,它输出一次 'B' 并调用 baz
并将其较低的参数作为第二个参数 - 返回代码是 x*y
,也是。
foo
是“顶级”函数(紧接在 main
之后),也是最复杂的函数。它不仅输出一次 'F',而且输出 a
次(因为最后的 foo(a-1)
在 bar
调用。bar
调用将 a
和 foo(a-1)
相乘,这将乘以 a-1
和 foo(a-2)
等等,直到 foo(1)
被评估并返回1。所以返回码是 a * (a -1) * ... 2 * 1
,所以 a!
。
这不是一个完整的分析,f.e.我们不知道字符的输出顺序,但这是一个粗略的方案 - 正如您和评论中的其他人指出的那样,这就是您想要的 - 策略而不是完整的答案。
关于c++ - 像计算机一样思考的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700739/