递归

递归是一种常见的解决问题的方法,即把问题逐渐简单化,递归的基本思想是“自己调用自己”。

 

递归的结构包括两部分:

1、 递归头:解答什么时候不调用自身方法。如果没有递归头,将陷入死循环,也就是递归的结束条件。

2、 递归体:什么时候需要调用自身方法。

 

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

(2)问题解法按递归算法实现。

这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。

如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。

 

递归的缺点:

递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。

 1 /**
 2  * result
 3  * 用递归求n的阶乘
 4  * Fibonacci
 5  * 用递归求第n位斐波那契数
 6  * @author huang
 7  *
 8  */
 9 
10 public class digui {
11     
12     //用递归求n的阶乘
13     public static long result(int n) {
14         if(n==1){
15             return 1;
16         }else {
17             return result(n-1)*n;
18         }
19     }
20     
21     //用递归求斐波那契数列
22     public static int Fibonacci(int m) {
23         if(m<=0){
24             return 0;
25         }
26         if(m==1 ||m==2){
27             return 1;
28         }
29         else {
30             return Fibonacci(m-1)+Fibonacci(m-2);
31         }
32     }
33     
34     public static void main(String[] args) {
35         Scanner scanner = new Scanner(System.in);
36         System.out.println("请输入阶乘数n:");
37         int n = scanner.nextInt();
38         long d1 = System.currentTimeMillis();
39         result(n);
40         long d2 = System.currentTimeMillis();
41         System.out.println(n+"的阶乘结果为:"+result(n));
42         System.out.println("阶乘耗时为:"+(d2-d1));
43         
44         System.out.println("#########");
45         
46         System.out.println("请输入要计算的斐波那契数位n:");
47         int m = scanner.nextInt();
48         long d3 = System.currentTimeMillis();
49         Fibonacci(m);
50         long d4 = System.currentTimeMillis();
51         System.out.println("斐波那契数为:"+Fibonacci(m));
52         System.out.println("耗时为:"+(d4-d3));
53     }
54 
55 }

 

posted @ 2021-07-03 23:46  风中一抹黄  阅读(180)  评论(0)    收藏  举报