c++ - 像计算机一样思考的策略

标签 c++ programming-languages evaluation

我有一些考试题需要推导以下代码的输出:

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 调用将 afoo(a-1) 相乘,这将乘以 a-1foo(a-2) 等等,直到 foo(1) 被评估并返回1。所以返回码是 a * (a -1) * ... 2 * 1,所以 a!

这不是一个完整的分析,f.e.我们不知道字符的输出顺序,但这是一个粗略的方案 - 正如您和评论中的其他人指出的那样,这就是您想要的 - 策略而不是完整的答案。

关于c++ - 像计算机一样思考的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700739/

相关文章:

performance - 包含跨语言基准的资源?

math - 我应该在数学游戏中使用表达式解析器吗?

scheme - 如何评估从 Scheme 中的函数返回的符号?

c++ - 使用并行编程时调用函数

c++ - 如何使用精度可能不同的 sprintf 格式化 float

programming-languages - 这个概念的名称是什么?

text - ROUGE-SU 度量、含义和公式

c++ - 在 C++ 中继承结构的最有效方法?

c++ - 适合 C++ 初学者的有趣控制台程序

windows - 针对 Mac/Unix 开发人员的 MS Windows 编程建议