关于递归
递归在处理循环调用方法本身上有很好的效果,它的特点是牺牲了内存,在特定情况下提高了运算速度。如在求 某数的阶乘,利用递归调用显然比循环乘法运算更有效果(在输入较大数时容易溢出)
package recur; import java.util.Scanner; public class Recur { public static void main(String[] args) { System.out.println("请输入一个整数:"); int n = new Scanner(System.in).nextInt(); long ret = factorial1(n); System.out.println(n+"的阶乘为:"+ret); } /** * 一般求参数i的阶乘 * @param i 输入的整数 * @return 返回i的阶乘的计算结果 */ private static long factorial(int i) { long r = 1; if(i==0||i==1){ return r; } for(;i>0;i--){ r=r*i; } return r; } /** * 递归求参数i的阶乘 * @param i 输入的整数 * @return 返回i的阶乘的计算结果 */ private static long factorial1(int i) { if(i==0){ return 1; } return i*factorial1(i-1); } }
再看一个一个例子,求第n个斐波那契数:1,1,2,3,5,8,13......,在这个例子中利用递归显然没有普通算法有优势,,一般情况下有多个递归分支的情况下不建议使用递归方法。
private static long Fibonacci(int n) {
long a = 1;//第一个
long b = 1;//第二个
for(int i=3;i<=n;i++) {
b = a+b;
a = b-a;
}
return b;
}
//递归
private static long Fibonacci(int n) {
if(n == 1 || n == 2) {
return 1;
}
return f(n-1) + f(n-2);
}