“通过完成这个项目,您将熟悉使用递归和在C ++中创建ADT。
创建一个整数堆栈ADT(您可以修改讲义中给出的IntStack ADT),使其最大容量至少为256个元素。还添加所需的任何内容,如果它被打印到C ++ ostream(例如cout),它将打印出其内容(从左到右,堆栈的顶部在右侧)。应该设计该堆栈,使其仅保持大于零的有意义值。小于或等于零的值应打印为“?”。
编写课堂上讨论的Fibonacci序列的递归实现。另外 - 创建一个堆栈ADT的实例,它在调用之间持续存在(它不能是局部变量),并且在每一步中,将一个无意义的值推入其中,直到确定该阶段的值,然后将其弹出,并在返回之前推入确定的值并打印整个堆栈。
你的程序应该要求确定Fibonacci序列中的位置N,然后它应该输出函数调用的结果。示例输出(包括递归函数的输出)如下:
输入Fibonacci序列中的位置以确定:5
?-?-?-1
?-?-?-1
?-?-2
?-?-1
?-3
?-?-1
?-?-1
?-2
5
Fibonacci(5) = 5
这里的输出究竟是什么?是否在计算第5个位置时打印出堆栈?还有关于如何在C ++中将Fibonacci实现为堆栈的任何想法?这些值应该存储在数组,列表中还是无关紧要?我是一个菜鸟所以任何帮助都会非常感激。感谢
答案 0 :(得分:1)
是的,它正在计算第5个斐波纳契数(碰巧是5,这有点令人困惑),但是看看你在调用斐波那契(5)时的计算结果,假设以下代码为斐波那契:
int fibonacci(int n) {
if (n <= 1) return n;
else if (n == 2) return 1;
else return fibonacci(n-1) + fibonacci(n-2);
}
这里是计算fibonacci(5)的函数调用:
f(5)
-> f(4)
-> f(3)
-> f(2)
-> f(1)
-> f(2)
->f(3)
-> f(2)
-> f(1)
如果你把它看作二叉树,他们给你的输出是一个后序树遍历,其数量为?是该堆栈的深度,数字是该节点的值。
所以只需执行该功能所做的工作,每次看到返回时,写下你返回的内容(使用之前的?):
答案 1 :(得分:0)
将您的整个问题分成更小的部分,这些部分可以由他们自己解决/实施。在这种情况下,有两个主要部分:
示例输出?-?-?-1
可以理解为以下堆栈操作:
push 0
push 0
push 0
push 1
print
答案 2 :(得分:0)
我将堆栈打印给您并解决使用堆栈存储标记(“无意义”数字)和结果的混乱部分。这是部分伪代码:
procedure fib(n)
push a marker (say a zero) to a global stack
if n is 1 or 2 then
result = you_know_what
else
calculate fib(n-1)
pop the stack ==> fib_n_minus_1
calculate fib(n-2)
pop the stack ==> fib_n_minus_2
result = fib_n_minus_1 + fib_n_minus_2
endif
pop the marker off the stack and discard
push the result into the stack
print the stack
end fib
这里要注意的关键是fib()不返回值。相反,它将返回值推送到全局堆栈。