斐波那契数列的数组法和递归法
数组法:
public static int Fibonacci(int n) {
int[] f = new int[n+1];
f[1] = f[2] = 1;
for (int i = 3; i <= n; i++) {
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
递归法:
public static int Fibonacci(int n) {
if(n == 1 || n == 2){
return 1;
}
return Fibonacci(n-1) + Fibonacci(n-2);
}
循环递归
//循环递归求x的n次方
public static double myPow(double x, int n) {
long N = n;
if (n < 0) {
x = 1 / x;
N = -n;
}
double ans = 1.0;
for (int i = 0; i < N; i++) {
ans *= x;
}
return ans;
}
尾递归
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。------百度百科
//反例:return是一个表达式
public static double myPow(double x, int n) {
if(n == 0){
return 1;
}
if(n < 0){
return (1/x) * myPow(x,n + 1);
}else{
return x * myPow(x,n - 1);
}
}
而上面这个代码如果这样调用myPow(0.00001, 2147483647)
会出现这种错误Exception in thread "main" java.lang.StackOverflowError at Test.myPow(Test.java:332) at Test.myPow(Test.java:332) at Test.myPow(Test.java:332)
因为这样会在每次return时生成一个新的栈,导致了栈溢出。所以要避免这种形式的递归,可以使用上边循环来代替递归。