Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修正Fibonacci序列的迭代形式_Java_C++_Math_Sequence_Fibonacci - Fatal编程技术网

Java 修正Fibonacci序列的迭代形式

Java 修正Fibonacci序列的迭代形式,java,c++,math,sequence,fibonacci,Java,C++,Math,Sequence,Fibonacci,我只是在学习斐波那契级数算法的迭代版本。我发现了以下代码 int Fibonacci(int n) { int f1 = 0; int f2 = 1; int fn; for ( int i = 2; i < n; i++ ) { fn = f1 + f2; f1 = f2; f2 = fn; } } intfibonacci(intn) { int f1=0; int f2=1; int-fn; for(int

我只是在学习斐波那契级数算法的迭代版本。我发现了以下代码

int Fibonacci(int n)
{
   int f1 = 0;
   int f2 = 1;
   int fn;
   for ( int i = 2; i < n; i++ )
   {
      fn = f1 + f2;
      f1 = f2;
      f2 = fn;
   }
}  
intfibonacci(intn)
{
int f1=0;
int f2=1;
int-fn;
for(int i=2;i

我脑子里刚冒出一个愚蠢的问题。上面的函数将前面的两个数字相加并返回第三个数字,然后为下一次迭代准备变量。如果是这样呢。“返回前三个数字之和的序列数”我们如何更改上述代码以找到这样的数字。作为提示,请注意,上述算法通过在一些变量中“循环”数字来工作。在上面的代码中,在每个存储点

 F_0    F_1
  a      b
然后在循环中通过一个步骤“移动”它们:

 F_1    F_2
  a      b
然后在下一个循环迭代中再次“移动”它们:

 F_2    F_3
  a      b
如果要更新最后三个值之和的算法,请考虑按如下方式存储它们:

 T_0    T_1    T_2
  a      b      c
然后再次移动它们:

 T_1    T_2    T_3
  a      b      c
 T_2    T_3    T_4
  a      b      c
然后再次移动它们:

 T_1    T_2    T_3
  a      b      c
 T_2    T_3    T_4
  a      b      c
将这种直觉转化为代码是一个很好的练习,所以我将把这些细节留给您

也就是说,有一种更快的方法来计算斐波那契和“Tribonacci”序列的第n项。描述了一个非常巧妙的技巧,使用矩阵乘法比上面的循环更快地计算术语,并且有代码实现了该算法


希望这有帮助

我通常不会回答那些“闻起来”像家庭作业的问题,但既然别人已经回答了,我会这样做:

int Tribonacci(int n)
{
    int last[3] = { 0, 0, 1 }; // the start of our sequence

    for(int i = 3; i <= n; i++)
        last[i % 3] = last[i % 3] + last[(i + 1) % 3] + last[(i + 2) % 3];

    return last[n % 3];
}
inttribonaci(intn)
{
int last[3]={0,0,1};//序列的开始

对于(inti=3;i我喜欢递归。叫我虐待狂吧

static int rTribonacci (int n, int a, int b, int c) {
    if (n == 0) return a;
    return rTribonacci (n-1, b, c, a + b + c);
}

int Tribonacci (int n) { return rTribonacci(n, 0, 0, 1); }

如果要使用递归,则不需要任何其他参数:

int FibonacciN(int position)
{   if(position<0) throw new ArgumentException("invalid position");
    if(position==0 || position ==1) return position;
    return FibonacciN(position-1) + FibonacciN(position-2);
}
int FibonacciN(int位置)

{if(positionumm…
f=(f-1)+(f-2)+(f-3)
可以归结为代数:
f=(3*f)-6
@MarcB-你上面写的是真的,但符号是错误的。循环是f(n)=f(n-1)+f(n-2)+f(n-3),这不能像您描述它的方式那样简化。这是最简单的部分。我们将如何使用f1、f2、f3的值为下一次迭代做好准备?您就在现场。这实际上是一个棘手的部分,它将值重新分配给变量的方式。它正在工作。谢谢,做得很好。