一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现
解决方案 »
- java能 开发 桌面应用程序吗? 或者说java 开发 的桌面应用程序有实际应用吗?
- 我想请教一个关于鼠标和键盘事件的问题,请教各位大大告诉我以下
- java环境变量问题
- jdk文档在那里下载?
- 请教一个java的小问题!万分急!!!!!!!!!!!!!!!!!!!!
- 屁股着火了,请各位大哥帮帮小弟。高分加提成
- static块初始化static变量时产生的异常有没有方法抛出,让使用该static变量的语句能接收到这个异常?
- 请问大家如何进行ejb的测试?假如开发工具是jbuilder。
- 各位兄弟,我初来报到,请各位多多关照,顺便问个问题?
- 关于数据库查询!
- 同一个主窗口下多个Jdialog
- 用JAVA设计文件资源管理器,怎么在树目录下进行添加删除文件夹??麻烦高手指点一下
public int a(int n) {
return (n > 2) ? a(n-1) + a(n-2) : 1;
}
public static void main(String[] args){
System.out.println(method(30));//测试
}
public static int method(int n){//递归算法
if(n <= 0){
return 0;
}else{
if(n == 1 || n == 2){
return 1;
}else{
return method(n-1) + method(n-2);
}
}
}
}
wonderful
public class Main {
static int[] ia = new int[30];
/** Creates a new instance of Main */
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
ia[0]=1;
ia[1]=1;
aa(ia[0],ia[1],2);
System.out.println(ia[29]);
}
static void aa(int i,int j,int end){
ia[end]=i+j;
if(end==29){
return ;
}
aa(ia[end-1],ia[end],end+1);
}
}
public class Test {
public static void main(String[] args) {
long star = System.currentTimeMillis();
//getNum01(100);
System.out.println(getNum01(30) + " : " + (System.currentTimeMillis() - star));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
star = System.currentTimeMillis();
System.out.println(getNum02(30) + " : " + (System.currentTimeMillis() - star));
}
static long getNum01(int i){
long[] values = new long[i];
values[0] = 1;
values[1] = 1;
for(int m = 2; m < i; m++){
values[m] = values[m-1] + values[m-2];
}
return values[i-1];
}
static long getNum02(int i){
return i > 2 ? getNum02(i -1) + getNum02(i - 2) : 1 ;
}
}
测试结果:
832040 : 0
~~~~~~~~~~~~~~~~~~~~~~~~~
832040 : 16
这还好是求 30 位的 ,如果求 50位的话,你就会以为自己那死机了呢。
private int[] _a(int n) {
if (n < 0) return new int[]{ 0, 0 };
if (n < 3) return new int[]{ 1, n-1 };
int[] ary = _a(n - 1);
int i = ary[0];
ary[0] = i + ary[1];
ary[1] = i;
return ary;
}
public int a(int n) {
return _a(n)[0];
}
14楼的代码,没看出优化在哪。我感觉一点都没优化。
我也写一个,非递归:
public static long[] a(int n) {
long[] arr = new long[n];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
} return arr;
}
这样的话,俺就只能上公式了。
public class Fibonacci { static double sqrt5 = Math.sqrt(5); /**
* @param args
*/
public static void main(String[] args) { for (int i = 0; i < 20; i++) {
System.out.println("F" + i + ":" + getFibonacci(i));
} } public static int getFibonacci(int n) { return (int) ((Math.pow(((1.0 + sqrt5) / 2.0), n) - Math.pow(((1.0 - sqrt5) / 2.0), n)) / sqrt5);
}}
输出:
F0:0
F1:1
F2:1
F3:2
F4:3
F5:5
F6:8
F7:13
F8:21
F9:34
F10:55
F11:89
F12:144
F13:233
F14:377
F15:610
F16:987
F17:1597
F18:2584
F19:4181
import java.util.*;
public class Test15 {
/***
*15,求斐波那契数列前n项的和值,斐波那契数列如下:
1,1,2,3,5,8,13,21……
前两位数是1,从第三位开始每位数都是前两位数之和
*
*/
public static void main(String[] args) {
System.out.println("请问您要前几项的和?(整数)");
Scanner input =new Scanner(System.in);
int length=input.nextInt();
int []a =new int [length];
new Test15().output(a, a.length);
}
void output(int[]a,int n)
{
int sum=0;
for(int i=0;i<n;i++)//给数组赋值
{
if (i==0||i==1)
{
a[i]=1;
}
else
{
a[i]=a[i-1]+a[i-2];
}
}
for(int i=0;i<n;i++)//求和
{
sum+=a[i];
}
System.out.println("斐波那契数列前"+n+"项的和是"+sum);
}
}