Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm - Fatal编程技术网

Java Fibonacci算法中的计数加法

Java Fibonacci算法中的计数加法,java,algorithm,Java,Algorithm,我两种算法都工作正常。这两种算法是斐波那契算法,它将在n处找到斐波那契数,其中用户指定n。我有三个方法:其中两个返回n处的斐波那契数,最后一个方法在以表格形式显示所有斐波那契数的同时执行这两个方法,其中一列对应代码中执行加法的次数 我声明了全局计数器recAdd和itAdd,它们分别表示在每个算法中添加的行。这些值在每次执行后都会重置我的测试线束,但我在这里不显示这些值 public static long recFib(int n){ //Recursive Fibonacci Algorit

我两种算法都工作正常。这两种算法是斐波那契算法,它将在n处找到斐波那契数,其中用户指定n。我有三个方法:其中两个返回n处的斐波那契数,最后一个方法在以表格形式显示所有斐波那契数的同时执行这两个方法,其中一列对应代码中执行加法的次数

我声明了全局计数器recAdd和itAdd,它们分别表示在每个算法中添加的行。这些值在每次执行后都会重置我的测试线束,但我在这里不显示这些值

public static long recFib(int n){ //Recursive Fibonacci Algorithm
    if( n <= 0){
        return 0;
    }
    if(n == 1){
        return 1;
    }
    else if(n == 2){
        return 1;
    }
    else{
        recAdd++;                               //Counts number of lines added.
        return recFib(n-1) + recFib(n-2);   //Recurisvely adds fibonnachi numbers. Starts with user's input n. Method is called repeatedly until n is less than 2.
    }
}

public static long itFib(int n){ //Iterative Fibonacci Algorithm
    long x, y, z;

    if(n == 0){
        return 0;
    }
    else{
        x = 1;
        y = 1;

        for(int i = 3; i <=n; i++){
            z = x+y;        //z is equal to the addition of x and y, which serve as f(n-1) + f(n-2).
            x = y;      //x is shifted to the next fibonacci number, previously known as y.
            y = z;      //y is set equal to z, which was the new value created by the old y and the old x.
            itAdd++;        //counts how many times addition has occured.
        }
    }
    return y;
}   

public static void doTheyMatch(int n){

    System.out.printf("%s %15s %15s %15s %15s", "i", "Recursive", "recAddCount", "Iterative", "itAddCount\n\n"); //Tab header

    for(int i = 0; i <= n; i++){
    System.out.printf("%d %12d %12d %12d %12d\n", i, recFib(i), recAdd, itFib(i), itAdd);       
    }

    System.out.printf("%s %15s %15s %15s %15s", "\ni", "Recursive", "recAddCount", "Iterative", "itAddCount\n"); //Repeat for quick referencing
}
publicstaticlong-recFib(intn){//递归Fibonacci算法

如果(n这是因为您没有在doTheyMatch函数上重置加法计数器

应该做一些类似的事情:

System.out.printf("%d %12d %12d %12d %12d\n", i, recFib(i), recAdd, itFib(i), itAdd);

// reset counters
recAdd = 0;
itAdd = 0;

这里的问题是,当您递归调用函数时,数字越大,调用函数的次数就越多。数字为0或1的可能性仅为1,因此函数被调用了那么多次。您需要做的是将
recAdd++;
语句放入e这些if块:

if( n <= 0){
    return 0;
}
if(n == 1){
    return 1;
}
else if(n == 2){
    return 1;
}

if(n这是因为使用递归,方法调用分支,并且在递归过程中多次调用该方法。这意味着它的累积速度比迭代快。尝试在纸上绘制一些较小数字的方法调用,并跟踪itAdd和recAdd变量,您将了解我的意思。希望这有帮助

不确定这对您是否有用,但如果您试图找到某个数字的斐波那契
n
您可以使用公式
F(n)=(k^n-p^n)/sqrt(5)
其中
n
是序列中的迭代次数或特定数字,
k=(1+sqrt(5))/2
p=(1-sqrt(5))/2

我不明白您的问题是什么?我正在计算两种算法分别执行加法的次数。当分别执行时(在输出图像中),它们的行数确实正确。当我使用doTheyMatch()时算法,迭代和递归算法都会执行,但添加的行没有正确计算。我的问题是:如何使用doTheyMatch()方法同时正确添加正确的行数。recAdd和itAdd行确实被重置。在我的菜单线束中的while循环结束时,我重置了它们,因为在菜单上进行任何选择后,开关盒结束。如果仔细查看我链接的图像,在最后一个示例中,计数器变量从0开始,直接在我执行了递归算法。但是计数器是静态变量,你必须在每次循环迭代时重置它们。也许可以查看你关于“静态变量”问题的课堂讲稿。你是对的,我不认为我需要重置doTheyMatch()for循环中的计数器变量方法,而我在方法本身结束后重置了变量。