递归问题(面试题) 如何解答 1,2,4,7,12,20.....用递归算法,采用Java语言实现,如何实现。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class Test { public static int printdemo(int index){ int i = 0; if(index <= 0){ i = 0; }else{ i = printdemo(index -1) + printdemo(index -2) + 1; } return i; } public static void main(String[] s){ for(int i = 1;i < 10;i++){ System.out.print(printdemo(i)); if(i != 9){ System.out.print(","); } } }} 最简单的方式是数学表达式:f(n) = f(n-1) + f(n-2) + 1 (n>2)f(1) = 1 (n=1)f(2) = 2 (n=2)int f(int n){ if(n<=0) throw new IllegalArgumentException("num<=0"); return n<=2?n:f(n-1)+f(n-2)+1;}不过明显效率太低求f(n-1) 的时候实际就求了f(n-2)的值。所以最好能推导成 f(n) = af(n-1) + b n + c 的形式,不过没想出来。所以可以考虑缓存结果,在计算n前先计算n/2或者n/10的情况,然后再计算n,直接使用刚才计算的结果。可以大大提高速度,不过不是个通用的方法。另外还有中转换为矩阵进行计算的方式,是最佳答案,不过我知道的不清楚。 这个数列的a(n)-a(n-1)这些差构成了一个fibonacci数列public class Test2 { public int fib(int n){ if(n==1){ return 1; } else if(n==2){ return 2; }else{ return fib(n-1)+fib(n-2); } } public int shulie(int n){ if(n==1){ return 1; }else{ return shulie(n-1)+fib(n-1); } } public static void main(String[] args) { // TODO Auto-generated method stub Test2 t = new Test2(); for(int i=1;i<20;i++){ System.out.print(t.shulie(i)+"\t"); } }运行结果:1 2 4 7 12 20 33 54 88 143 232 376 609 986 1596 2583 4180 6764 10945 我认为做这种递归题首先应该把它们之间的关系写出来然后再根据数学表达式去写代码:1>写它们之间的数学表达式(就像2楼所写的那样):f(n) = f(n-1) + f(n-2) + 1 (n>2)f(1) = 1 (n=1)f(2) = 2 (n=2) 2>根据数学表达式写代码: public static int fun(int n){ if(1==n) return 1; else if(2==n) return 2; else return fun(n-1) + fun(n-2)+1; }例如:想知道它第5个数出什么,就应该调用: System.out.println(fun(5)); //答案为12 inputstream读N个字节的奇怪现象 io读写文件出现字符乱码?如何解决? 关于用htmlparser提取页面文字的问题 还是数据库,前辈高手指点迷津啊(只有10分了) Jtree 设置间隔 表格滚动的问题 我用FTPCLient访问IIS上的ftp服务,报错 JDK1.3下的程序能完全在JDK1.4下运行吗? 各位大虾,多提点意见。 java 时间处理 在组合框上鼠标右击弹出菜单 我的JDK安装上了,可为什么还是用不成?
public static int printdemo(int index){
int i = 0;
if(index <= 0){
i = 0;
}else{
i = printdemo(index -1) + printdemo(index -2) + 1;
}
return i;
}
public static void main(String[] s){
for(int i = 1;i < 10;i++){
System.out.print(printdemo(i));
if(i != 9){
System.out.print(",");
}
}
}
}
f(n) = f(n-1) + f(n-2) + 1 (n>2)
f(1) = 1 (n=1)
f(2) = 2 (n=2)int f(int n){
if(n<=0) throw new IllegalArgumentException("num<=0");
return n<=2?n:f(n-1)+f(n-2)+1;
}不过明显效率太低求f(n-1) 的时候实际就求了f(n-2)的值。所以最好能推导成 f(n) = af(n-1) + b n + c 的形式,不过没想出来。所以可以考虑缓存结果,在计算n前先计算n/2或者n/10的情况,然后再计算n,直接使用刚才计算的结果。可以大大提高速度,不过不是个通用的方法。另外还有中转换为矩阵进行计算的方式,是最佳答案,不过我知道的不清楚。
public int fib(int n){
if(n==1){
return 1;
}
else if(n==2){
return 2;
}else{
return fib(n-1)+fib(n-2);
}
}
public int shulie(int n){
if(n==1){
return 1;
}else{
return shulie(n-1)+fib(n-1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test2 t = new Test2();
for(int i=1;i<20;i++){
System.out.print(t.shulie(i)+"\t");
}
}
运行结果:1 2 4 7 12 20 33 54 88 143 232 376 609 986 1596 2583 4180 6764 10945
1>写它们之间的数学表达式(就像2楼所写的那样):
f(n) = f(n-1) + f(n-2) + 1 (n>2)
f(1) = 1 (n=1)
f(2) = 2 (n=2)
2>根据数学表达式写代码: public static int fun(int n){
if(1==n) return 1;
else if(2==n) return 2;
else
return fun(n-1) + fun(n-2)+1;
}
例如:想知道它第5个数出什么,就应该调用:
System.out.println(fun(5)); //答案为12