Fibonacci(斐波那契)数列的JAVA解法

合集下载

递归求斐波那契数列的时间复杂度

递归求斐波那契数列的时间复杂度

递归求斐波那契数列的时间复杂度
斐波那契数列是一个经典的数列,其定义为:前两项为1,之后每一项都是前两项的和。

即:1,1,2,3,5,8,13,21,34,……
递归求解斐波那契数列是一种常见的方法,其实现如下:
int fibonacci(int n) {
if (n <= 2) {
return 1;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
这段代码的时间复杂度是多少呢?我们可以通过递归树的方式
来分析。

当n=5时,递归树如下所示:
f(5)
/
f(4) f(3)
/ /
f(3) f(2) f(2) f(1)
/
f(2) f(1)
我们可以发现,在计算f(5)的过程中,我们需要计算f(4)和f(3)。

而计算f(4)的过程中,又需要计算f(3)和f(2)。

因此,递归树的深度为n,且每个节点都会递归两次。

因此,当n越大时,递归树的节点数将呈指数级增长,即其时间复杂度为O(2^n)。

这意味着,当我们要计算一个较大的斐波那契数列时,递归方法将非常低效。

我们应该使用其他方法,如迭代或矩阵快速幂,来计算斐波那契数列。

fibonacci数列递归算法的实现,集合全排列问题递归算法的实现,整数划分问题递归算

fibonacci数列递归算法的实现,集合全排列问题递归算法的实现,整数划分问题递归算

Fibonacci数列、集合全排列和整数划分问题Fibonacci数列Fibonacci数列是一个由0和1开始,每个后续数字等于前两个数字之和的数列。

以下是Fibonacci数列的递归算法实现:// 递归实现Fibonacci数列function fibonacci(n) { if (n <= 1){ return n; } return fibonacci(n - 1) + fibonacci(n - 2);}集合全排列集合全排列问题是指给定一个集合,求该集合中元素的全排列。

以下是集合全排列的递归算法实现:// 递归实现集合全排列function permute(arr, start = 0) { if (start === arr.length) { console.log(arr); // 输出当前排列 } for (let i = start; i < arr.length; i++) { // 交换当前元素与起始位置元素 [arr[start], arr[i]] = [arr[i], arr[start]]; permute(arr, start + 1); // 递归调用下一次排列 [arr[start],arr[i]] = [arr[i], arr[start]]; // 恢复当前元素与起始位置元素的交换 }}整数划分整数划分问题是指将一个整数拆分成多个正整数的和,求所有的划分方式。

以下是整数划分的递归算法实现:// 递归实现整数划分function partition(n, max, prefix = []) { if (n === 0) { console.log(prefix); // 输出当前划分 } for (let i = Math.min(max, n); i >= 1; i--) { partition(n - i, i, [...prefix, i]); // 递归调用下一次划分 }}。

java递归算法经典题目

java递归算法经典题目

java递归算法经典题目递归是一种常见的算法思想,它通过将问题分解为更小的子问题来解决问题。

在Java中,递归算法可以用于解决许多经典问题,如斐波那契数列、汉诺塔、阶乘等。

下面我们将介绍一些Java递归算法经典题目,帮助您更好地理解和掌握递归算法。

1.斐波那契数列斐波那契数列是一个经典的递归问题,它是指从第0项开始,每一项都是前两项的和。

在Java中,可以使用递归方法来求解斐波那契数列。

以下是一个简单的递归算法实现:```javapublicstaticintfibonacci(intn){if(n<=1){returnn;}else{returnfibonacci(n-1)+fibonacci(n-2);}}```这个算法会一直递归调用直到达到斐波那契数列的末项为止。

需要注意的是,递归算法的时间复杂度较高,当n值较大时可能会导致栈溢出等问题。

2.汉诺塔问题汉诺塔问题是一个经典的递归问题,它描述了一个操作:将一堆盘子从一个柱子移动到另一个柱子,要求遵循以下规则:每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

在Java中,可以使用递归方法来解决汉诺塔问题。

以下是一个简单的递归算法实现:```javapublicstaticvoidhanoi(intn,Stringfrom,Stringto,Stringvia) {if(n==1){System.out.println("Movedisk"+n+"from"+from+"to"+to);}else{hanoi(n-1,from,via,to);System.out.println("Movedisk1from"+from+"to"+to);hanoi(n-1,via,to,from);}}```这个算法会一直递归调用,直到完成所有盘子的移动。

斐 波 那 契 数 列 _ 数 据 结 构 与 算 法

斐 波 那 契 数 列 _ 数 据 结 构 与 算 法

多种方法实现Fibonacci(斐波那契)数列的生成斐波那契(Fibonacci)数列问题,是一个非常经典的问题。

1、What is Fibonacci sequence?斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

【摘选自百度百科】2、How to create Fibonacci sequence?———————————-华丽丽的分割线———————————-此方法是博主在一次java作业期间想到的,当时作业是一个运用斐波那契数列、黄金分割率做文章的题目。

期间,博主还运用了BigDecimal、BigInteger两个java类来实现任意精度下的斐波那契数列、黄金分割率。

详细java代码见博主GitHub-**代码实现(由于int类型的承载的范围有限,因此我们通过此种方法穷举出int类型范围内的所有斐波那契数列项)**- Three f = new Three(1);while (f.getTwo() 0) {f = new Three(i);System.out.println(f.getOne());System.out.println("现有条件(int)下能够存储的所有斐波那契数列见上");-**Three.java**-public class Three {private int one = 0;private int two = 1;public Three(int i) {for (int j = 1; j i; j++) {forward();public void forward() {this.one = this.two;this.two = this.three;this.three = this.one + this.two;public int getOne() {return this.one;public int getTwo() {return this.two;public int getThree() {return this.three;方法二:(当然是传统的递归调用啦^_^)--由于递归方法的时间消耗比较大,所以这里只递归到40项(再往后程序将会一直卡住,许久才会出结果)for(int i = 1;i = 40;i++){System.out.print(fibonacci(i)+" ");void fibonacci(int n){return 0;return 1;return fibonacci(n) + fibonacci(n-1);方法三:(其他方法^_^)其实大多数方法都是通过改良递法而产生的,我们能够明显的看出递归法时间成本较高的原因是因为没有存储。

动态规划问题(斐波那契数列)

动态规划问题(斐波那契数列)

动态规划问题(斐波那契数列)算法1. 动态规划题⽬1:写⼀个函数,输⼊ n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。

斐波那契数列的定义如下:F(0) = 0, F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加⽽得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

⽰例 1:输⼊:n = 2思路:1. ⾸先想到的是递归,后⾯的函数需要调⽤前⾯的函数,并且有明显的停⽌条件。

2. 然后是动态规划,要计算第三个数,只需要知道前⾯两个数即可,⽽最开始的两个很容易得出。

再下⼀次计算中舍弃第⼀个,保留第⼆三个数。

作为下⼀轮的第⼀⼆位。

如此重复操作即可。

(就是⼀个循环的问题)代码:public class Fib {//测试public static void main(String[] args) {System.out.println(fib(22));System.out.println(fib01(1000));}//思路1public static int fib(int n) {if (n == 0 || n == 1) {return n;}return fib(n - 1) + fib(n - 2);}//思路2public static int fib01(int n) {if (n < 2) {return n;}final int MOD = 1000000007;int a = 0;int b = 1;int c = 0;for (int i = 1; i < n; i++) {c = (a + b) % MOD;a = b;b = c;}return c;}}题⽬2:⼀只青蛙⼀次可以跳上1级台阶,也可以跳上2级台阶。

编程实现斐波那契数列(递归)

编程实现斐波那契数列(递归)

编程实现斐波那契数列(递归)斐波那契数列是一个非常著名的数列,它以数列中每个元素都是前两个元素之和来定义,即F(n) = F(n-1) + F(n-2)。

这个数列的前几项为0、1、1、2、3、5、8、13……
用递归的方法实现斐波那契数列的代码如下:
```
def fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
```
这个函数实现的思路很简单,它判断了一些边界条件(如n等于0或1),然后递归地调用自身,并返回前两个元素之和。

使用这个函数计算斐波那契数列的第10项的代码如下:
```
print(fibonacci(10))
```
运行这段代码将输出第10项斐波那契数,即55。

递归实现斐波那契数列的代码简单易懂,但它也有一些缺点。

当n 很大时,递归函数将会重复计算很多项,并且每次调用函数都需要占用一定的内存空间。

因此,在计算较大的斐波那契数列时,使用循环实现可能会更加高效。

总之,学习和掌握斐波那契数列的递归实现方法对于我们来说是非常有意义的。

不仅能帮我们更好地理解递归的思想,还能让我们在后续的编程学习中更加深入地掌握各种算法和数据结构。

fibonacci法的算法步骤

fibonacci法的算法步骤

Fibonacci法的算法步骤1. 引言Fibonacci法是一种用于生成Fibonacci数列的算法。

Fibonacci数列是一个无限序列,每个元素都是前两个元素的和,起始于0和1。

这个数列以意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci)的名字命名。

Fibonacci法是一种递归算法,它可以被用于求解各种与Fibonacci数列相关的问题。

本文将详细介绍Fibonacci法的算法步骤,并提供一些实例来帮助读者更好地理解这个算法。

2. 算法步骤Fibonacci法的算法步骤可以简单概括为以下几个步骤:步骤 1:确定问题的规模在使用Fibonacci法解决问题之前,我们需要明确问题的规模。

这个规模可以用一个整数n来表示,它指示了我们要找到Fibonacci数列中的第n个元素。

步骤 2:确定基本情况Fibonacci数列有两个基本情况:F(0)和F(1)。

在这些基本情况下,返回固定的值。

通常,我们定义F(0)为0,F(1)为1。

步骤 3:使用递归计算使用递归算法是Fibonacci法的核心步骤。

我们可以根据Fibonacci数列的递归定义来进行计算:F(n) = F(n-1) + F(n-2)。

在这个步骤中,我们首先判断是否处于基本情况。

如果是,就返回基本情况对应的值。

否则,我们递归地调用函数,传入n-1和n-2作为参数,并将它们的结果相加,得到F(n)的值。

步骤 4:返回结果在完成递归计算后,我们将得到F(n)的值。

这是我们解决问题的最终结果。

3. 算法示例下面是一个使用Fibonacci法计算Fibonacci数列中第n个元素的示例代码:def fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)# 测试代码n = 10result = fibonacci(n)print(f"The {n}th Fibonacci number is: {result}")在这个示例中,我们定义了一个名为fibonacci的函数,它接受一个整数n作为参数,返回Fibonacci数列中第n个元素的值。

斐波那契数列递归

斐波那契数列递归

斐波那契数列递归1斐波那契数列斐波那契数列又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),称为斐波纳契数列,也叫黄金分割数列。

2递归法斐波那契数列可用递归的方法来实现,即:```F(n)=F(n-1)+F(n-2)F(1)=1F(2)=1```基本思想就是用函数自身来定义,函数调用自身来解决问题;它利用递归(此时一般会被记为类似于循环),然后依次求解每一个节点的值,先求解较小的节点,由较小的节点构成较大的结点,最后到达F(n)的值。

3代码实现基于Python的实现:```def Fibonacci(n):if n<0:print("输入有误")elif n==1:return1elif n==2:return1else:return Fibonacci(n-1)+Fibonacci(n-2)```可以看出,Fibonacci函数通过判断n是几来分别返回1和0,如果n不是1抑或2,就返回Fibonaccin-1加上Fibonacci(n-2)的和即为第n位的值,以此类推,实现的整个算法。

4其他实现方式虽然使用递归的方式可以实现斐波那契数列,但也可以使用其他方法,通过把上次计算结果存储在一个数组里,每一次计算时只需要取出上一次存储的结果即可。

实现如下:```def Fibonacci(n):list=[0,1]for i in range(n-1):list.append(list[-1]+list[-2])return list[-1]```根据这种实现方式,每计算出第n位数值即存入列表中,在求第n+1位值时,只要前取出列表中最后两位数值相加便可,这样就节省了递归实现方式中每次重复求F(n-1)和F(n-2)的耗时。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
System.out.println("参数错误!");
return;
}
if(n<=2){
sum = 1;
}else{
for(int i=3;i<=n;i++){
sum = n1+n2;
n1 = n2;
n2 = sum;
}
}
System.out.println(sum);
}
}
输出Fibonacci数列
System.out.print(""+fib[i]);
System.out.println();
}
}
Fibonacci(斐波那契)数列的JAVA解法
fibonacci数列的递归算法
public class Fib_ra
{
public static int fibonacci(int n)
{
if(n>=0)
if(n==0||n==1)
return n;
else
return fibonacci(n-2)+fibonacci(n-1);
{
short i=0,j=1;
do{
System.out.print(""+i+""+j);
i=(short)(i+j);
j=(short)(i+j);
}while(i>0);
System.out.println();
}
}
用一位数组保存Fibonacci序列值
public class Fib_array
System.out.println();
}
}
计算斐波那契数列(Fibonacci)的第n个值
public class Fibonacci{
public static void main(String args[]){
int n = Integer.parseInt(args[0]);
int n1 = 1;//第一个数
return -1;
}
public static void main(String args[])
{
int m=25,n;
int fib[]=new int[m];
for(n=0;n<m;n++)
fib[n]=fibonacci(n);
for(n=0;n<fib.length;n++)
System.out.print(" "+fib[n]);
public class Fib
{
public static void main(String args[])
{
short i=0,j=1;
do{
System.out.print(""+i+""+j);
i=(short)(i+j);
j=(short)(i+j);
}while(i>0);
System.out.println();
}
}
System.out.println(sum);
}
}
计算斐波那契数列(Fibonacci)的第n个值并打印
public class FibonacciPrint{
public static void main(String args[]){
int n = Integer.parseInt(args[0]);
for(i=0;i<fib.length;i++)
System.out.print(""+fib[i]);
System.out.println();
}
}
用do-while输出Fibonacci数列
public class Fib
{
public static void main(String args[])
}
}
用一位数组保存Fibonacci序列值
public class Fib_array
{
public static void main(String args[])
{
int n=25,i;
int fib[]=new int[n];
fib[0]=0;
fib[1]=1;
for(i=2;i<n;i++)
fib[i]=fib[i-1]+fib[i-2];
FibonacciPrint t = new FibonacciPrint();
for(int i=1;i<=n;i++){
t.print(i);
}
}
public void print(int n){
int n1 = 1;//第一个数
int n2 = 1;//第二个数
int sum = 0;//和
if(n<=0){
{
public static void main(String args[])
{
int n=25,i;
int fib[]=new int[n];
fib[0]=0;
fib[1]=1;
for(i=2;i<n;i++)
fib[i]=fib[i-1]+fib[i-2];
for(i=0;i<fib.length;i++)
int n2 = 1;//第二个数
int sum = 0;//和
if(n<=0){
System.out.println("参数错误!");
return;
}
if(n<=2){
sum = 1;
}else{
for(int i=3;i<=n;i++){
sum = n1+n2;
n1 = n2;
n2 =ห้องสมุดไป่ตู้sum;
相关文档
最新文档