「java斐波拉切」java斐波拉切数列
本篇文章给大家谈谈java斐波拉切,以及java斐波拉切数列对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、递归算法的弊端与改进
- 2、java 怎么编写斐波那契数列 之和 急求
- 3、(java方法递归) 刚学方法递归,但感觉和循环语句差不多,有没有人讲解下两者区别。谢谢
- 4、java编程 已知f(n)=f(n-1)+f(n-2), f(0)=a,f(1)=b,已知a,n,f(n),求b
递归算法的弊端与改进
递归一直给人的感觉是简洁且优雅,但是在面对较大规模的问题时,递归的弊端就渐渐暴露出来了。因为大量栈的使用导致程序运行速度变得很慢,所以递归算法需要改进。
1.尾递归:函数返回之前的最后一个操作若是递归调用,则该函数进行了尾递归。
但是我发现尾递归貌似并没有很显著的作用???(值得深究)
2.递归改递推,举例斐波拉切数列
递归算法大于40之后就会变得很慢,甚至算不出来。而递推算法可以算更大的数而且算得更快( 即使用了long,但是超过50还是会溢出gg )。
所以面额拼凑问题就需要使用 递推法 ,一个一个算,看似非常傻但是却比递归好用,或许这就是 大智若愚 吧。
比较难理解的可能是 m[j]+=m[j-den[i]];其等价于之前提到的递推式(1020,100)=(1020-100,100)+(1020,50),但是我们发现(1020,50)没了,这是因为之前已经加上去了。
在这个两层循环中,第一层就是以不同的面额做循环,例如(5,5)=(0,5)+(5,1),之所以省略掉了(5,1)是因为在之前就已经将(5,1)加上去了( m[j]=1 ),所以可以直接 m[j]+=m[j-den[i]] .当面额为5循环完毕之后,就可以开始面额为10的循环了。(10,10)=(5,10)+(10,1)=(5,5)+(10,1),由于之前(10,1)已经加上去了,所以直接加上(5,5)就可以了。一次类推直到面额100循环完毕,结果就出来了。(感觉没有讲清楚)
碰到的问题:
1.10000的时候出现溢出。原因:之前在intellij(java)中写的时候用long(64位)没问题,但是 C语言(dev c++和VS)long是32位的 ,所以使用long long
2.dev c++使用的是gcc编译器支持 动态数组 ,VS不支持所以一开始报错。改为 long long *m=new long long[money+1];
java 怎么编写斐波那契数列 之和 急求
import java.util.Scanner;
public class test{
public static void main(String[] args) {
long numA = 0;
long numB = 0;
long temp = 0;
long sum = 0;
System.out.print("请输入要计算的项数:");
long num = new Scanner(System.in).nextLong();
for (int i = 1; i = num; i++) {
if (i == 1 || i == 2) {
numA = 1;
numB = 1;
temp = 1;
}else{
temp = numA + numB;
numA = numB;
numB = temp;
}
sum += temp;
}
System.out.println("斐波拉切数列前" + num + "项和是:"+sum);
}
}
(java方法递归) 刚学方法递归,但感觉和循环语句差不多,有没有人讲解下两者区别。谢谢
1、差别还是比较大的,或许,循环可以实现的递归也可以实现,但递归较容易实现的,循环就很难
2、根据求斐波那契数列来说
package algorithm.cxg.Fibonacci;
import java.util.Scanner;
/**
* 实现斐波拉切函数
* 斐波拉切数列:
* 由0和1开始,之后的费波那西系数就由之前的两数相加,
* 数列形式如下:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………
* 在数学上,是以递归的方法来定义:
* F_0=0
* F_1=1
* F_n = F_{n-1}+ F_{n-2}
* 实现需求:输入序号n返回得到对应费波那西数
* @author admin
*
*/
public class Fibonacci {
public static void main(String[] args) {
/*//定义数列的前两项
int a=0,b=1;
//定义第n项
Scanner scan = new Scanner(System.in);
System.out.println("请输入斐波拉切数列的30项以内第n项:");
int n = scan.nextInt();
//输出
System.out.println("斐波那契数列30项以内的第n项的和为:");
System.out.print(a+"\n"+b+"\n");
//根据数列得出的函数循环计算
for (int i = 0; i = 30 ; i++) {
n=a+b;
a=b;
b=n;
System.out.println(n+"\t");
}*/
System.out.println("斐波那契数列30项以内的第n项的和为:");
for (int j = 1; j = 20; j++) {
System.out.print(getFibonacco(j) + "\t");
}
}
//递归函数实现数列
public static int getFibonacco(int i) {
if (i==1) {
return 0;
} else if (i==1 || i==2) {
return 1;
} else {
return getFibonacco(i-1)+getFibonacco(i-2);
}
}
}
3、所谓递归,程序调用自身的编程技巧称为递归( recursion),循环是什么?在一定的条件下重复的执行,这个‘固定’的重复叫循环,你思考如果循环,怎么求斐波那契数列?
java编程 已知f(n)=f(n-1)+f(n-2), f(0)=a,f(1)=b,已知a,n,f(n),求b
public int fibo(int m,int a,int b){
if(m == 0) return a;
if(m == 1) return b;
if(m 1) return fibo(m - 1)+fibo(n - 2);
return 0;
}
以上就是给出a,b和n的值,求f(n),这也是递归的一个案例,如果a、b明确,可直接替换掉函数中的a、b值,而只留一个参数m即可。
java斐波拉切的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java斐波拉切数列、java斐波拉切的信息别忘了在本站进行查找喔。
发布于:2022-12-28,除非注明,否则均为
原创文章,转载请注明出处。