遞歸與循環是兩種不同的解決問題的典型思路。
遞歸算法:
優點:代碼簡潔、清晰,並且容易驗證正確性。(如果你真的理解了算法的話,否則你更暈)
缺點:它的運行需要較多次數的函數調用,如果調用層數比較深,需要增加額外的堆棧處理,比如參數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞歸,那將是極端難看的代碼。
循環算法:
優點:速度快,結構簡單。
缺點:並不能解決所有的問題。有的問題適合使用遞歸而不是循環。如果使用循環並不困難的話,最好使用循環。
遞歸算法 和循環算法總結
1. 一般遞歸調用可以處理的算法,也通過循環去解決常需要額外的低效處理 。
2. 現在的編譯器在優化后,對於多次調用的函數處理會有非常好的效率優化,效率未必低於循環。
以下是Java代碼實現(遞歸與遞推兩種方式):
[java] import java.util.Scanner;
/**
* Fibonacci
*
* @author tongqian.zhang
*/
public class Fibonacci {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Please input this fibonacci n:");
int n = scanner.nextInt(); // 假設輸入為大於零的整數
System.out.println(fibonacci(6) + ":" + fibonacciNormal(6));
int sum = 0;
for(int i = 1; i <= n; i++){
sum += fibonacci(i);
}
System.out.println(sum);
}
// 遞歸實現方式
public static int fibonacci(int n){
if(n <= 2){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
// 遞推實現方式
public static int fibonacciNormal(int n){
if(n <= 2){
return 1;
}
int n1 = 1, n2 = 1, sn = 0;
for(int i = 0; i < n - 2; i ++){
sn = n1 + n2;
n1 = n2;
n2 = sn;
}
return sn;
}
}