Recursion 编写一个返回斐波那契序列堆栈的递归函数

Recursion 编写一个返回斐波那契序列堆栈的递归函数,recursion,stack,fibonacci,Recursion,Stack,Fibonacci,我的老师刚在考试中问了这个问题,我不知道该去哪里。 更多详细信息,功能原型如下所示: stack<int> Fibonacci_sequence(int n); //fibonacci numbers count up to n stack Fibonacci_序列(intn)//斐波那契数到n 关键是这个函数是递归的,它应该返回堆栈数据类型。在我看来,我不认为这是一个可能的事情,但我的老师问它 抱歉,我的语言是C++函数堆栈斐波那契序列(int n){ function sta

我的老师刚在考试中问了这个问题,我不知道该去哪里。 更多详细信息,功能原型如下所示:

stack<int> Fibonacci_sequence(int n); //fibonacci numbers count up to n
stack Fibonacci_序列(intn)//斐波那契数到n
关键是这个函数是递归的,它应该返回堆栈数据类型。在我看来,我不认为这是一个可能的事情,但我的老师问它

抱歉,我的语言是C++

函数堆栈斐波那契序列(int n){
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
    }
}
如果n==0{ var是一个堆栈; a、 推(0); 归还 }如果n==1,则为else{ var是一个堆栈; a、 推(0); a、 推(1); 归还 }否则 var-temp-int; var-seq-int; seq=斐波那契序列(n-1); 温度=序号pop; 顺序推送(温度); 顺序推送(温度); //上图:堆栈的顶部元素必须重复,因为它 //在计算总和的过程中弹出。 seq.push(seq.pop()+斐波那契序列(n-2.pop()); 返回顺序 } }

上面的函数就是这样做的,它是用伪代码编写的,因为您没有指定语言。希望这有帮助,这是有趣的想出!谢谢你提出了这个有趣的问题。

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

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]
def fib(n)#没有显式的返回类型,因为在Ruby中一切都是对象
如果n<0,则“不允许使用否定参数”失败
如果n>1
堆栈=fib(n-1)
#抓取最后两个值。。。
f_n_1=stack.pop
f_n_2=stack.pop
#…并用它们来计算下一个。
#此表达式的值是结果堆栈,返回它
返回堆栈.push(f_n_2).push(f_n_1).push(f_n_1+f_n_2)
elsif n==1
返回fib(0)。推送(1)
其他的
返回[]。推送(0)
结束
结束
p fib(10)#=>[0,1,1,2,3,5,8,13,21,34,55]

<>你可能需要把这个翻译成你的考试语言,但这是合适的。

< P>这是我基于埃利奥特伪的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'
    }
}
stack Fibonacci_序列(int n)
{
如果(n==0){
堆栈a;
a、 推(0);
返回a;
}
else如果(n==1){
堆栈a;
a、 推(0);
a、 推(1);
返回a;
}
其他的
{
内部温度;
temp=Fibonacci_序列(n-1).pop();//错误C2440:“=”:无法从“void”转换为“int”
Fibonacci_序列(n-1).push(temp);
Fibonacci_序列(n-1).push(temp);
//上图:堆栈的顶部元素必须重复,因为它
//在计算总和的过程中弹出。
返回Fibonacci_序列(n-1).push(Fibonacci_序列(n-1).pop()+Fibonacci_序列(n-2).pop());//错误C2186:“+”:类型为“void”的非法操作数
}
}

为这个公式编写代码:
如果(n=0或1)那么fib(n)=1,否则fib(n)=fib(n-1)+fib(n-2)
。检查这个链接:我知道如何生成FIB序列,但不知道如何返回包含它的堆栈,这样你可以在C++中更具体,因为我真的不知道这些想法。如何使用:Fibonacci_序列(n-1).push(Fibonacci_序列(n-1).pop()+Fibonacci_序列(n-2).pop());因为Fibonacci_序列只是一个返回堆栈的函数,所以它不是堆栈,对吗?想象一下:b=Fibonacci_序列(n-1)//因为它返回堆栈,对吗?c=Fibonacci_序列(n-2)//现在你可以做:b.push(b.pop()+c.pop()),这只是写上面内容的一种更长的方式。行:返回Fibonacci_序列(n-1)。push(Fibonacci_序列(n-1)。pop()+Fibonacci_序列(n-2)。pop());将导致错误,因为推送是一个无效类型,然后它不能返回,我如何才能修复它?啊,你是对的,我的坏。取而代之的是Fibonacci(n-1)。push(Fibonacci(n-1)。pop()+Fibonacci(n-2)。pop())返回Fibonacci(n-1)。我将编辑我的伪代码,只是在最后一个else中做了一点小小的更改:else{stack b;b=Fibonacci_序列(n-1);b.push(Fibonacci_序列(n-1)。top()+Fibonacci序列(n-2)。top())CUT你能帮我在C++中工作吗?我真的不知道容器推送在那个函数中的作用,它是一个函数,它返回一个栈,但是它不是一个栈,我不打算为你写你的答案。我使用标准栈操作<代码> Pux<代码>和<代码> POP< /COD>,这是Ruby中的数组操作。此逻辑应映射到任何提供堆栈的语言,该堆栈具有
push
/
pop
。我没有完成此问题就完成了考试:D,我只想知道答案。问题是堆栈fibonacci(int n)是一个函数,而不是一个堆栈,你怎么能使用STL容器呢?我真的不明白。在这种情况下,我建议把翻译这个当作一个学习练习。
fib
是上面代码中的一个函数,我甚至在评论中指出它没有显式的返回类型,但你应该清楚地看到
return
statements。我看不出你的问题,用
Fibonacci\u序列
替换
fib
全局,以获得几乎1-1的所需映射。你不想一直多次调用你的
Fibonacci\u序列