编写一个返回Fibonacci序列堆栈的递归函数

时间:2015-10-09 05:15:01

标签: recursion stack fibonacci

我的老师刚刚在考试中提出了这个问题,我不知道该往哪里去。 更多细节,函数原型如下:

stack<int> Fibonacci_sequence(int n); //fibonacci numbers count up to n

关键是这个函数是递归的,它应该返回一个堆栈数据类型。在我看来,我不认为这是可能的事情,但我的老师问了!!

P.s:对不起,我的语言是C ++

3 个答案:

答案 0 :(得分:1)

function stack<int> Fibonacci_sequence(int n) {
    if n == 0 {
        var a stack<int>;
        a.push(0);
        return a
    } else if n == 1 {
        var a stack<int>;
        a.push(0);
        a.push(1);
        return a
    } else
        var temp int;
        var seq int;
        seq = Fibonacci_sequence(n-1);
        temp = seq.pop;  
        seq.push(temp);
        seq.push(temp);
        //above: the top element of the stack must be duplicated because it
        //is popped off in the process of calculating the sum.
        seq.push(seq.pop()+Fibonacci_sequence(n-2).pop());
        return seq
    }
}

上面是一个功能就是这样,用伪代码编写,因为你没有指定语言。希望这有所帮助,想出来很有趣!感谢有趣的问题。

答案 1 :(得分:0)

由于您没有指定语言,您指定了它是一个考试,这里是Ruby。 Ruby为数组提供堆栈操作,但我在下面只使用pushpop操作,因此您应该能够轻松地将其转换为您选择的语言。

def fib(n)  # no explicit return type, since everything's an object in Ruby
  fail "negative argument not allowed" if n < 0
  if n > 1
    stack = fib(n - 1)
    # grab the last two values...
    f_n_1 = stack.pop
    f_n_2 = stack.pop
    # ...and use them to calculate the next.
    # The value of this expression is the resulting stack, return it
    return stack.push(f_n_2).push(f_n_1).push(f_n_1 + f_n_2)
  elsif n == 1
    return fib(0).push(1)
  else
    return [].push(0)
  end
end

p fib(10)     # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

您可能需要将其翻译为考试语言,但这是恰当的。

答案 2 :(得分:0)

这是基于@Elliot伪的我的C ++代码,它有错误,我在代码中指定了这些错误。而我只是发现pop()没有返回值,我会解决这个问题。

stack<int> Fibonacci_sequence(int n)
{
    if (n == 0) {
        stack<int> a;
        a.push(0);
        return a;
    }
    else if (n == 1) {
        stack<int> a;
        a.push(0);
        a.push(1);
        return a;
    }
    else
    {
        int temp;
        temp = Fibonacci_sequence(n - 1).pop(); //error C2440: '=': cannot convert from 'void' to 'int'
        Fibonacci_sequence(n - 1).push(temp);
        Fibonacci_sequence(n - 1).push(temp);
    //above: the top element of the stack must be duplicated because it
    //is popped off in the process of calculating the sum.
        return Fibonacci_sequence(n - 1).push(Fibonacci_sequence(n - 1).pop() + Fibonacci_sequence(n - 2).pop());//error C2186: '+': illegal operand of type 'void'
    }
}