「java斐波拉切」java斐波拉切数列

博主:adminadmin 2022-12-28 01:54:07 67

本篇文章给大家谈谈java斐波拉切,以及java斐波拉切数列对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

递归算法的弊端与改进

递归一直给人的感觉是简洁且优雅,但是在面对较大规模的问题时,递归的弊端就渐渐暴露出来了。因为大量栈的使用导致程序运行速度变得很慢,所以递归算法需要改进。

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斐波拉切的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。