Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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 打印斐波那契数列的结果_Java_Fibonacci - Fatal编程技术网

Java 打印斐波那契数列的结果

Java 打印斐波那契数列的结果,java,fibonacci,Java,Fibonacci,我知道斐波那契级数的编码是: int fib(int n) { if (n==0 || n==1) return n; else return fib(n-1)+fib(n-2); } 我想知道是否有一种方法,使用前面提到的代码,来打印序列的先前结果,但既不使用void函数(其作用仅类似于序列的打印机),也不为每次计算调用fibonacci函数 我不想这样做 for (int i=0;i<4;i++){ System.out.prinntln(fib(i));

我知道斐波那契级数的编码是:

int fib(int n)
{
    if (n==0 || n==1) return n;
    else return fib(n-1)+fib(n-2);
}
我想知道是否有一种方法,使用前面提到的代码,来打印序列的先前结果,但既不使用void函数(其作用仅类似于序列的打印机),也不为每次计算调用fibonacci函数

我不想这样做

for (int i=0;i<4;i++){
     System.out.prinntln(fib(i));
}

for(inti=0;iOk,所以我没有看到您希望保留递归

那么这个呢:

public class fib {

  static int fibonacci(int value, boolean printThis) {
    int result;
    if (value==0 || value==1) {
      result = value;
      if (printThis) {
        System.out.print(result);
        System.out.print(", ");
      }
    } else {
      if (printThis) {
        result =  fibonacci(value-1, true)+fibonacci(value-2, false);
        System.out.print(result);
        System.out.print(", ");
      } else {
        result = fibonacci(value-1, false)+fibonacci(value-2, false);
      }
    }
    return result;
  }

  public static void main(String []args) {
    fibonacci(7, true);
    System.out.println();
  }
}
我看不出,如果不使用布尔值
printThis
来控制只打印两个值上的递归生成的树的一条路径,那么您就无法做到这一点。为了更清楚一点,请查看如何以递归方式执行此操作

递归向后调用计算,因此
faculty(n)
faculty(n-1)
之前被调用。当您想要在
faculty(n)
之前打印
faculty(n)
的值时,您需要在返回值之前进行打印,如下所示:

static int faculty(int v) {
  int result;
  if (v==0) {
    result = 1;
  } else {
    result = v*faculty(v-1);
  }
  System.out.print(result);
  System.out.print(", ");
  return result;
}
这将按升序给出值。我希望您能原谅最后一个逗号,如果您想在没有布尔参数控制的情况下摆脱它,您需要定义一个附加函数

所以你可以不用布尔函数来控制打印

但这是因为
faculty
不会跨越递归调用树,而只是一个调用序列。如前所述,我只看到如果通过添加布尔函数可以控制整个调用树的打印

这就是你想要的吗

无论如何,这里仍然是我的第一个答案(效率更高,并且可以更快地为您提供相同的输出):

迭代计算斐波那契数,而不是递归计算

最简单的方法是使用数组fib[]。 用fib[0]=0,fib[1]=1初始化。 然后迭代i=2到n,其中fib[i]=fib[i-1]+fib[i-2]

这也很容易调整,所以不需要完整的数组,只需要存储两个变量 fib[i-1],fib[i-2]


事实上,你可以使用这个迭代循环,然后再次使它成为一个递归循环,但是它的结构与你原来的斐波那契函数不同。

你可以编写另一个方法
void printFib(int n)
,然后使用这个循环来打印每个
fib(n)
在这个方法中。一个返回值的方法实际上不应该打印任何东西。但是如果你像Zane说的那样迭代计算每个数字,你可以有一个void方法来计算和打印值。我看不到任何方法可以在递归斐波那契方法中打印值。

一个关于斐波那契级数的简单例子

class Fibonacci {
public static void main(String args[]) {

    fibonacciSeries(6);

}

static void fibonacciSeries(int num) {
    int a = 0, b = 1, i, c;

    for (i = 0; i <= num; i++) {
        if (i <= 1) {
            c = i;
        } else {
            c = a + b;
            a = b;
            b = c;
        }
        System.out.print(c);
        if(i != num) {
            System.out.print(",");
        }
    }
}
类斐波那契{
公共静态void main(字符串参数[]){
斐波那契系列(6);
}
静态void fibonacci系列(int num){
int a=0,b=1,i,c;

对于(i=0;i在一行中写入斐波那契级数

   public class Fib {
        public static void main(String[] args) {
            for(int i=1,f=0,n=0; n<15; n++,System.out.println(i=(f+(f+i))-(f=f+i)));            
        }
    }
公共类Fib{
公共静态void main(字符串[]args){
对于(inti=1,f=0,n=0;n
intsum=1;
int n1=0,n2=1;
对于(int i=0;i<10;i++)
{
if(i<1)
{
系统输出打印(一);
系统输出打印(“”);
}
否则,如果(i>1)
{
系统输出打印(总和);
系统输出打印(“”);
总和=n1+n2;
n1=n2;
n2=总和;
}
}

下面是一个简单的示例,用于打印每个计算:

int x = 1;
int a = 0;
int t;

while(true)
{
    System.out.println(x);

    t = x;
    x = x + a;
    a = t;

    if (x > 30)
    {
        break;
    }        
}
这将打印以下内容:

1
1
2
3
5
8
13
21

这是小于30的斐波那契数列。

我希望这是打印斐波那契数列的简单方法。

package Practice;

public class Fabonacci {

    public static void main(String[] args) 
    {
        int a,b,c;
        a=0;
        b=1;
        c=2;

        for(int i=1; i<=10; i++)
        {
            c=a+b;
            System.out.println(a);
            a=b;
            b=c;        
        }
    }
}
斐波那契级数


这可能是很好的一个

 public static void febonassi(int range, int pre, int nxt) {
    System.out.println(pre);
    if (nxt <= range)
        febonassi(range, nxt, nxt + pre);
}
publicstaticvoidfebonassi(int-range,int-pre,int-nxt){
系统输出打印项次(预处理);

if(nxt我使用了大小为
howManyDigit
的int数组

这是我用较少变量编写斐波那契级数的最好方法

    int[] array = new int[howManyDigit];
    for(int i=0;i<howManyDigit;i++){
        if(i>1)
             array [i]=array [i-1]+array [i-2];
        else
            array [i]=i;
    }
    System.out.println(Arrays.toString(array));
int[]数组=新的int[howManyDigit];
对于(int i=0;i1)
数组[i]=数组[i-1]+数组[i-2];
其他的
数组[i]=i;
}
System.out.println(array.toString(array));

到目前为止,这是我对斐波那契序列得出的最有效、最快的方法:

斐波那契动态版本

public static BigInteger getFibonacciDynamic(long n) {

    BigInteger[] fibonacci = new BigInteger[(int) n + (n == 0 ? 2 : 1)];
    fibonacci[0] = BigInteger.valueOf(0);
    fibonacci[1] = BigInteger.valueOf(1);

    for (int i = 2; i <= n; i++) {
        fibonacci[i] = fibonacci[i - 1].add(fibonacci[i - 2]);
    }

    return fibonacci[(int) n];
}
public static biginger getFibonacciDynamic(长n){
BigInteger[]斐波那契=新的BigInteger[(int)n+(n==0?2:1)];
斐波那契[0]=BigInteger.valueOf(0);
斐波那契[1]=biginger.valueOf(1);
对于(int i=2;i[EDIT1]
我修复了打印N_0的功能,很酷:

public class Main
{
    public static int f(int n, boolean p, int level, final int deep) {
        if (n < 2) {
            if (p || level == deep) System.out.println(1);
            return 1;
        } else {
            int res = f(n-1, true && p, level + 1, deep) + f(n-2, false, level + 1, deep);
            if (p) {
                System.out.println(res);
            }
            return res;
        }
    }
    public static void main(String[] args) {
        int n = 10;
        f(n, true, 0, n-1); // print recursive
    }
}
公共类主
{
公共静态int f(int n,布尔p,int level,final int deep){
if(n<2){
if(p | | level==deep)System.out.println(1);
返回1;
}否则{
int res=f(n-1,真&正,级别+1,深度)+f(n-2,假,级别+1,深度);
如果(p){
系统输出打印项次(res);
}
返回res;
}
}
公共静态void main(字符串[]args){
int n=10;
f(n,真,0,n-1);//递归打印
}
}


我可以在一个函数中完成,但丢失了数字N_0,如下所示:
我将其解释为调用递归函数时的堆栈:

因此,返回函数的值类似于此堆栈:

我们需要打印圆圈中的数字,所以我包含一个布尔参数 要做到这一点:

公共类主
{
公共静态int f(int n,布尔p){
if(n<2){
if(p)System.out.println(1);
返回1;
}否则{
int res=f(n-1,真&假)+f(n-2,假);
如果(p){
系统输出打印项次(res);
}
返回res;
}
}
公共静态void main(字符串[]args){
系统输出打印项次(1);
f(10,真);//递归打印
}
}
结果非常漂亮:))

1 1 2 3 5 8 13
 public static void febonassi(int range, int pre, int nxt) {
    System.out.println(pre);
    if (nxt <= range)
        febonassi(range, nxt, nxt + pre);
}
    int[] array = new int[howManyDigit];
    for(int i=0;i<howManyDigit;i++){
        if(i>1)
             array [i]=array [i-1]+array [i-2];
        else
            array [i]=i;
    }
    System.out.println(Arrays.toString(array));
public static BigInteger getFibonacciDynamic(long n) {

    BigInteger[] fibonacci = new BigInteger[(int) n + (n == 0 ? 2 : 1)];
    fibonacci[0] = BigInteger.valueOf(0);
    fibonacci[1] = BigInteger.valueOf(1);

    for (int i = 2; i <= n; i++) {
        fibonacci[i] = fibonacci[i - 1].add(fibonacci[i - 2]);
    }

    return fibonacci[(int) n];
}
public static void main(String[] args) {

    int index = 0;
    while (index < 1000) {
        long time = System.currentTimeMillis();
        BigInteger value = getFibonacciDynamic(index);
        System.out.println("VALUE: " + value + " TOOK: " + (System.currentTimeMillis() - time) + "ms" + " OF INDEX: " + index);
        index++;
    }
}
VALUE: 0 TOOK: 0ms OF INDEX: 0
VALUE: 1 TOOK: 0ms OF INDEX: 1
VALUE: 1 TOOK: 0ms OF INDEX: 2
VALUE: 2 TOOK: 0ms OF INDEX: 3
VALUE: 3 TOOK: 0ms OF INDEX: 4
VALUE: 5 TOOK: 0ms OF INDEX: 5
VALUE: 8 TOOK: 0ms OF INDEX: 6
VALUE: 13 TOOK: 0ms OF INDEX: 7
VALUE: 21 TOOK: 0ms OF INDEX: 8
VALUE: 34 TOOK: 0ms OF INDEX: 9
VALUE: 55 TOOK: 0ms OF INDEX: 10
VALUE: 89 TOOK: 0ms OF INDEX: 11
VALUE: 144 TOOK: 0ms OF INDEX: 12
VALUE: 233 TOOK: 0ms OF INDEX: 13
VALUE: 377 TOOK: 0ms OF INDEX: 14
VALUE: 610 TOOK: 0ms OF INDEX: 15
VALUE: 987 TOOK: 0ms OF INDEX: 16
VALUE: 1597 TOOK: 0ms OF INDEX: 17
VALUE: 2584 TOOK: 0ms OF INDEX: 18
VALUE: 4181 TOOK: 0ms OF INDEX: 19
VALUE: 6765 TOOK: 0ms OF INDEX: 20
... till index 1000 with always < 10ms for each value
public static long getFibonacci(long n) {
    if(n <= 1) {
        return n;
    } else {
        return getFibonacci(n - 1) + getFibonacci(n - 2);
    }
}

---- PRINT ----
VALUE: 1134903170 TOOK: 9991ms OF INDEX: 45
public class Main
{
    public static int f(int n, boolean p, int level, final int deep) {
        if (n < 2) {
            if (p || level == deep) System.out.println(1);
            return 1;
        } else {
            int res = f(n-1, true && p, level + 1, deep) + f(n-2, false, level + 1, deep);
            if (p) {
                System.out.println(res);
            }
            return res;
        }
    }
    public static void main(String[] args) {
        int n = 10;
        f(n, true, 0, n-1); // print recursive
    }
}
public class Main
{
    public static int f(int n, boolean p) {
        if (n < 2) {
            if (p) System.out.println(1);
            return 1;
        } else {
            int res = f(n-1, true && p) + f(n-2, false);
            if (p) {
                System.out.println(res);
            }
            return res;
        }
    }
    public static void main(String[] args) {
        System.out.println(1);
        f(10, true); // print recursive
    }
}