从特定术语开始用Java编写Fibonacci序列

时间:2016-02-05 17:17:03

标签: java

我正在尝试编写基于Java的Fibonacci序列生成器。我在互联网上看到了很多例子:

public class Fibonacci {

    public static void main(String[] args) {
        generateFibonacci(20);  // generate the first 20 fibonacci numbers
    }

    public static void generateFibonacci(long limit) {
        long first = 0;
        long second = 1;
        System.out.print(first+", "+second);
        for(long i=1;i<limit;i++) {
            long next = first + second;
            System.out.print(", "+next);
            first = second;
            second = next;
        }
        System.out.println();
    }

}

它工作正常。问题是我不仅要生成前20个数字,而且还需要指定一个起点。例如:

public List<Long> generateFibonacci(long startFrom, long numberTerms) {

}

这样做的:

generateFibonacci(5, 10);

应输出: 8升
13升 21升 34升 55升 89升 144升 233升 377升

我尝试过以下代码,但似乎没有执行所需的操作:

public class example {
    public static void main(String[] args) {
        generateFibonacci(10, 5); 
    }

    public static void generateFibonacci(long limit, long startPoint) {
        long first = 0;
        long second = 1;
        long endPoint = startPoint + limit;
        System.out.print(first + ", " + second);
        for (long i = 1; i < endPoint; i++) {
            long next = first + second;
            if (i > startPoint) {
                System.out.print(", " + next);
            }
            ;
            System.out.print(", " + next);
            first = second;
            second = next;
        }
    }
}

关于如何以有效的方式实现这一目标的任何想法?

4 个答案:

答案 0 :(得分:0)

if (i > startPoint)此处您不必在i上添加条件,而是在next上。

  

问题是我不仅要生成前20个数字,   但我还需要指定一个起点。

另外,我不确定为什么要打印前两个元素,即01。我已移除sysout()以符合您指定的startPoint条件。

以下是更正后的代码段:

public static void generateFibonacci(long limit, long startPoint) {
    long first = 0;
    long second = 1;
    long endPoint = startPoint + limit;
    long next = first + second;
    for (long i = 1; i < endPoint; i++) {
        if (next > startPoint) {
            System.out.print(next + ", ");
        }
        first = second;
        second = next;
        next = first + second;
    }
}

输出:

8, 13, 21, 34, 55, 89, 144, 233, 377, 610

答案 1 :(得分:0)

第10行总是打印0和1,所以删除它。

第16行有一个分号,第17行打印所有Fibonacci数字,这就是为什么你得到你想要的两个

尝试:

public class example {
    public static void main(String[] args) {
    generateFibonacci(10, 5); 
}

public static void generateFibonacci(long limit, long startPoint) {
    long first = 0;
    long second = 1;
    long endPoint = startPoint + limit;
    for (long i = 1; i < endPoint; i++) {
        long next = first + second;
        if (i == startPoint) {
            System.out.print(next);
        }
        else if ( i > startPoint){
            System.out.print(", " + next);
        }
        first = second;
        second = next;
    }
}

答案 2 :(得分:0)

如你所说输出必须像这样

 8                                                                                                                                                                   
 [13, 21, 34, 55, 89, 144, 233, 377] 

并且您想要返回斐波那契数字列表

您可以通过这种方式返回列表!

public static void main(String[] args) {
    List<Long> list = generateFibonacci(10, 5);
    System.out.println(list.size());     
    System.out.println(Arrays.toString(list.toArray()));     
}

public static List<Long>  generateFibonacci(long limit, long startPoint) {
    List<Long> list = new ArrayList<>();

    long first = 0;
    long second = 1;
    long endPoint = startPoint + limit - 1;
    //System.out.print(first + ", " + second);
    if (startPoint==0){
            list.add(0);
            list.add(1);
    }else if (startPoint ==1){
            list.add(1);
    }
    for (long i = 2; i < endPoint; i++) {
        long next = first + second;
        if (i > startPoint) {
            // System.out.println(next);
            list.add(next);
        }

        first = second;
        second = next;
    }

    return list;
}

答案 3 :(得分:0)

由于你必须计算最初的斐波纳契数,所以只需使用标准方法即可:

public static void generateFibonacci(long limit, long startPoint) {
    return generateFibonacci(limit).subList(startPoint - 1, limit);
}