学习了递归和尾递归后,自己做了一些简单的总结,便于学习。
以典型的斐波那契数列为例,比较二者:
import java.util.Scanner; public class testFibonacci { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.println(fibonacci1(n)); System.out.println(fibonacci2(n,1,1)); fibonacci3(n); } //非尾递归 public static long fibonacci1(int n){ if(n==1) return 1; else if(n==2) return 1; else return fibonacci1(n-1)+fibonacci1(n-2); } //尾递归 public static long fibonacci2(int n,int f1,int f2){ if(n==1) return f1; else return fibonacci2(n-1,f2,f1+f2); } //迭代法 public static void fibonacci3(int n){ int f1 = 1,f2 =1 ,f; for(int i=3;i<=n;i++){ f = f2 ; f2 = f1 + f2 ; f1 = f ; } System.out.println(f2); } }
递归是一种很好地的解题算法思路,但是有时候受内存的限制,导致会出现运算很慢,出现结果比较漫长,而且会产生许多的重复计算,造成浪费。相比之下,迭代对内存的要求就少的很多,因为迭代是将每一步的运算结果参与下一次运算,不会产生过多的重复计算,这样计算就非常的快,但是迭代这种思维方式比较不容易想出来,需要中间数替换。而尾递归,我觉得就是介于这二者之间的一种新的算法方式,在递归中套用迭代的思想,将每一步的结果作为参数返回,参与下次的递归运算,直到条件终止。
时间: 2024-10-06 14:19:00