C ++ Stack Fibinacci Hw问题澄清

时间:2011-02-16 14:57:52

标签: c++ stack fibonacci

嘿,伙计们。我需要帮助理解我的hw任务。我是从C ++开始的,并不知道那么多。我知道堆栈和斐波那契序列的基础知识。但是,我并不完全理解给我的问题,也不需要解决问题的代码,但有助于澄清一些步骤。这是hw:

“通过完成这个项目,您将熟悉使用递归和在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实现为堆栈的任何想法?这些值应该存储在数组,列表中还是无关紧要?我是一个菜鸟所以任何帮助都会非常感激。感谢

3 个答案:

答案 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)

如果你把它看作二叉树,他们给你的输出是一个后序树遍历,其数量为?是该堆栈的深度,数字是该节点的值。

所以只需执行该功能所做的工作,每次看到返回时,写下你返回的内容(使用之前的?):

  • 返回的第一个函数是第一个f(2),深度为4: print? - ? - ? - 1
  • 第二个回报是它下面的f(1):打印? - ? - ? - 1
  • 第三个回报是f(2)和f(1)的父,其深度为3,值为f(2)+ f(1)= 2: print? - ? - 2
  • 依此类推,直到你在深度0和值5
  • 返回f(5)

答案 1 :(得分:0)

将您的整个问题分成更小的部分,这些部分可以由他们自己解决/实施。在这种情况下,有两个主要部分:

  1. Stack - 根据问题中给出的详细信息实现标准堆栈类。以点的形式列出它们可能会有所帮助。
  2. Fibonacci - 使用堆栈类递归生成Fibonacci系列。堆栈是此练习的存储机制。
  3. 示例输出?-?-?-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()不返回值。相反,它将返回值推送到全局堆栈。