如何在Java中创建斐波那契序列

如何在Java中创建斐波那契序列,java,python,Java,Python,我的数学很烂。我的意思是,我的数学真的很烂。 我正在尝试为我将要使用的算法创建一个简单的斐波那契序列类。我已经看过python示例,它看起来像这样: a = 0 b = 1 while b < 10: print b a, b = b, b+a 我最终得到的是加倍,这可以通过乘法实现:( 有人能帮我吗?数学对我很重要。这条线 a, b = b, b+a 不容易翻译。是这样的。你可以简化它。这是字面意思 t1 = b t2 = b+a a = t1 b = t2 我会这

我的数学很烂。我的意思是,我的数学真的很烂。 我正在尝试为我将要使用的算法创建一个简单的斐波那契序列类。我已经看过python示例,它看起来像这样:

a = 0
b = 1
while b < 10:
    print b
    a, b = b, b+a
我最终得到的是加倍,这可以通过乘法实现:( 有人能帮我吗?数学对我很重要。

这条线

a, b = b, b+a
不容易翻译。是这样的。你可以简化它。这是字面意思

t1 = b
t2 = b+a
a = t1
b = t2
我会这样做:

public class FibonacciAlgorithm {

    private int a = 0;

    private int b = 1;

    public FibonacciAlgorithm() {

    }

    public int increment() {
        int temp = b;
        b = a + b;
        a = temp;
        return value;
    }

    public int getValue() {
        return b;
    }
}
这将使它尽可能接近原始Java代码

[编者按:
整数
已替换为
整数
。没有理由为此使用
整数。

公共整数增量(){ a=b; b=a+b; 返回值; }


当然是错误的。我认为切换前两行应该可以做到这一点。

您需要先将a或b的值存储在临时变量中

    public Integer increment() 
    {                
            int temp = a;
            a = b;
            b = temp + b;
            return value;
    }

Java整数只能存储前46个斐波那契数,请使用查找表。

我将翻译您之前的代码:

public void fibb(int max) {
  int a = 0;
  int b = 1;
  while (a < max) {
    System.out.println(a);
    int temp = a + b;
    a = b;
    b = temp;
  }
}
public void fibb(int max){
int a=0;
int b=1;
while(a
难道你不想创建一个函数来返回第n个Fibnoacci数吗?我记得我小时候是这样教的:

public int Fibb(int index) {
if (index < 2)
    return 1;
else
    return Fibb(index-1)+Fibb(index-2);
};
public int-Fibb(int-index){
如果(指数<2)
返回1;
其他的
返回Fibb(索引-1)+Fibb(索引-2);
};

假设第一对Fibonacci数的定义是1,其他所有的都是基于1。现在,如果你只想打印出Fibonaccis,那么循环可能会更简单,这正是许多其他回复所涵盖的。

你的Python到Java翻译的主要问题是Python的赋值语句上面有一次执行全部,而Java的是串行执行的。Python的语句相当于这样说:

Make a list out of 'b' and 'a + b'
Make another list out of references to 'a' and 'b'
Assign all the elements from the second list to the first one
(它实际上可能是一个元组,我对Python并不十分熟练。)

因此,“b”和“a+b”在赋值之前先解析为值。在Java中不能同时进行这种多重赋值

一般来说,类似Python的语句

var1, var2, ...varN = expression1, expression2, ...expressionN
将用Java翻译为

temp1 = expression1;
temp2 = expression2;
...
tempN = expressionN;
var1 = temp1;
var2 = temp2;
...
varN = tempN;
通过这种方式,所有表达式在赋值发生之前解析为,并且没有任何赋值对表达式有副作用


如果我真的这样做,我可能会做查找表并存储long(因为Fibonacci数呈指数增长,我想超过46)。迭代形式,就像你所做的,将采用O(N)为了计算第n个Fibonacci值,典型的递归公式将使用与返回值一样多的函数调用。Fibonacci实际上要求将答案缓存在某个地方,这将使递归形式更加可行。

上面发布了一个递归解决方案,但此解决方案是尾部递归的,因此线性增长

public class Fibonacci {
    public long fibonacci(int number) {
        return fib(0,1,number);
    }

    private long fib(long result, long next, int n) {
        if (n == 0)
            return result;
        else
            return fib(next, result+next, n-1);
    }
}
我会这么做的

fib = 100;
for(int a = 1, b = 0;a <= fib;a += b, b = (a-b)) {
    System.out.print(a + ",");
}
fib=100;

对于(int a=1,b=0;a我认为没有理由使用Integer类。在这种情况下,您最好使用int。同时分配真的很好。我想知道是否有人知道它们为什么不是java的一部分?@ThomasAhle可能是因为它们非常混乱:)蒂克·科查兰:在它们本身,或者你可以用它们做的一些事情中?我一直认为它们更容易分析,因为你不必担心事情的顺序。@ThomasAhle当我第一次看到它们时,它打破了我的逻辑(见上文)。这个问题的全部基础是我假设它们会以某种方式工作,而它们不会:(谢谢!这完全解决了我的问题!谢谢你这么快就回来了!我正在用python代码拼命工作。我不知道为什么它会在python中正确执行,而不是在Java中。谢谢!Java没有像python那样的并行赋值,这就是为什么你需要temp变量。问题不是数学,而是对我所做的有更深的理解t表示并行赋值(S.Lott对其含义描述得相当好).是的,我可能最终会让它输出长值。该算法需要时间在索引的初始值中以指数形式增长,因为它会不断重新计算相同的数字。我没有说它是最优的,只是我在大学里上计算机科学101时教过递归。它肯定不会!你需要一个临时,如其他地方所述。此int值将在前40个左右的值之后溢出。最后60个将是溢出值和无意义。;)
fib = 100;
for(int a = 1, b = 0;a <= fib;a += b, b = (a-b)) {
    System.out.print(a + ",");
}