当前位置: 首页 > 知识库问答 >
问题:

Java斐波那契递归代码

轩辕越泽
2023-03-14

我试图想出一个程序,从用户那里获取任何数字,并生成斐波那契码的第n个数字。当我完成工作时,它会显示下一个,而不是我需要的。例如,我正在寻找第11个#和它的生产233而不是144。这是我的代码:

public static int fibonacci(int n)
{
    if (n<=0)
        return 1;
    else
        return fibonacci(n-2)+ fibonacci(n-1);
}


public static void main(String[] args)
{
    System.out.println("Enter a Number:");
    Scanner keyboard = new Scanner(System.in);
    int number = keyboard.nextInt();
    System.out.println("You Entered Number:" + number);
    System.out.println(number + "th Fibonacci Number is:"+ fibonacci(number));
    keyboard.close();        
}

共有3个答案

齐凯康
2023-03-14

Aleksandar已经给了你答案,但我认为有必要提醒你,你的代码效率非常低。实际上,对于计算fibo(4),你要计算fibo(3)fibo(2)fibo(3)将需要计算fibo(2)fibo(1)等。最后,您将花费大量时间计算已经计算的结果(并且您将使用指数级内存来存储本地递归调用上下文)。

为了获得更高效的代码,需要实现迭代或尾部递归方法。尾部递归方法meth是一种递归调用形式为meth(f(args))的方法。在您的例子中,递归调用的形式是f(meth,args),因此它不是尾部递归的。

下面是一个尾部递归版本:

public static int fibonacci(int n) {
    if (n == 0)
        return 0;
    else if (n <= 2)
        return 1;
    else 
        return fibonacciAux(0,1,n);
}

public static int fibonacciAux(int a, int b, int n) {
    if (count == 0)
        return b;
    else  
        return fibonacciAux(b,a + b,n - 1);
}

与使用指数时间和内存的非尾部递归版本相比,该版本将以线性时间运行,并将使用恒定的内存量。

黄磊
2023-03-14

你缺少一个索引。您正在打印下一个斐波那契数。改变现状

(n<=0)

(n<=1)

编辑:

正如另一个答案所说,fib(0)=0,所以你也必须添加这个边缘情况。

陶山
2023-03-14

它应该是

if(n == 0)
    return 0;
else if(n == 1)
    return 1;
else
    return fibonacci(n - 1) + fibonacci(n - 2);

因为fibonacci(0)=0

 类似资料:
  • 问题内容: 请解释以下简单代码: 我对最后一行感到困惑,特别是因为例如,如果n = 5,则将调用fibonacci(4)+ fibonacci(3),依此类推,但我不理解该算法如何以此来计算索引5的值方法。请详细解释! 问题答案: 在斐波那契数列中,每一项都是前两项的总和。因此,你编写了一个递归算法。 所以, 现在你已经知道了。因此,你可以随后计算其他值。 现在, 从斐波那契数列中我们可以看到斐波

  • 问题内容: 我在大学为我的Programming II类编写的程序需要一些帮助。这个问题要求人们使用递归来计算斐波那契数列。必须将计算出的斐波那契数存储在一个数组中,以停止不必要的重复计算并减少计算时间。 我设法使程序在没有数组和存储的情况下运行,现在我试图实现该功能,但遇到了麻烦。我不确定如何组织它。我已经浏览了Google并浏览了一些书,但没有太多帮助我解决如何实施解决方案的方法。 上面是不正

  • 我有两种不同的方法,一种是用迭代法计算第n个元素的斐波那契序列,另一种是用递归法。 程序示例如下所示: 我试图找出哪种方法更快。我得出的结论是,对于较小数量的数字,递归速度更快,但随着第n个元素的值增加,递归速度变慢,迭代速度变快。以下是三个不同n的三个不同结果: 示例#1(n=10) 示例#2(n=20) 示例#3(n=30) 我真正想知道的是,为什么迭代突然变得更快,递归变得更慢。如果我错过了

  • 本文向大家介绍Java递归实现斐波那契数列,包括了Java递归实现斐波那契数列的使用技巧和注意事项,需要的朋友参考一下 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所

  • 本文向大家介绍JAVA递归与非递归实现斐波那契数列,包括了JAVA递归与非递归实现斐波那契数列的使用技巧和注意事项,需要的朋友参考一下 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…

  • Python3 实例 以下代码使用递归的方式来生成斐波那契数列: 实例(Python 3.0+)# Filename : test.py # author by : www.runoob.com def recur_fibo(n): """递归函数 输出斐波那契数列""" if n <= 1: return n else: return(recur_fibo(n-1) + recur_fibo(n