蓝桥学院2019算法题2.1-2.5

递归基础练习题

代码实现及测试用例

  1 package recursion;
  2 
  3 import java.util.Arrays;
  4 
  5 /**
  6  * @author zsh
  7  * @company wlgzs
  8  * @create 2019-02-15 16:08
  9  * @Describe 递归练习
 10  */
 11 public class Main1 {
 12     public static void main(String[] args) {
 13         System.out.println("------------1、求n的阶乘----------------");
 14         System.out.println(f1(3));
 15         System.out.println("------------2、打印i到j-----------------");
 16         f2(1,3);
 17         System.out.println("---------3、对arr所有元素求和-----------");
 18         System.out.println(f3(new int[]{1,2,3,4,5},0));
 19         System.out.println("------------4、翻转字符串---------------");
 20         String str = "hello";
 21         System.out.println(reverse(str,str.length()-1));
 22         System.out.println("-----------5、斐波拉契数列--------------");
 23         System.out.println(fib(5));
 24         System.out.println("-----------6、最大公约数----------------");
 25         System.out.println(gcd(10,6));
 26         System.out.println("--------7、递归实现插入排序-----+-------");
 27         int[] arr = new int[]{5,4,9,6,3};
 28         System.out.println(Arrays.toString(insertSort(arr,arr.length-2)));
 29     }
 30 
 31     /**
 32      * f1(n)求n的阶乘 -->f(n-1)求n-1的阶乘
 33      * 找重复:n*(n-1)!,求(n-1)!是原问题的重复(规模更小) --子问题
 34      * 找变化:变化的量应该作为参数
 35      * 找边界:出口
 36      */
 37     static int f1(int n){
 38         if (n == 1)
 39             return 1;
 40         return n*f1(n-1);
 41     }
 42 
 43     /**
 44      * f2(i,j)打印i到j
 45      * 找重复:打印i,f2(i+1,j) --子问题
 46      * 找变化:变化的量应该作为参数
 47      * 找边界:出口 终止的条件
 48      */
 49     static void f2(int i,int j){
 50         if (i>j){
 51             return;
 52         }
 53         System.out.println(i);
 54         f2(i+1,j);
 55     }
 56 
 57     /**
 58      * f3(arr,begin) 对arr所有元素求和
 59      * 找重复:arr[begin] + f3(arr,begin+1) --子问题
 60      * 找变化:变化的量应该作为参数 begin作为变化的量,相当于头指针。
 61      * 找边界:出口 终止的条件 头指针与数组最后一个元素的索引相同
 62      */
 63     static int f3(int[] arr,int begin){
 64         if (begin == arr.length-1){
 65             return arr[begin];
 66         }
 67         return arr[begin] + f3(arr,begin+1);
 68     }
 69 
 70     /**
 71      * reverse(str,end) 翻转字符串
 72      * 找重复:str.charAt(end) + reverse(str,end-1) --子问题
 73      * 找变化:变化的量应该作为参数 end作为变化的量,相当于尾指针。
 74      * 找边界:出口 终止的条件 end == 0
 75      */
 76     static String reverse(String str,int end){
 77         if (end == 0){
 78             return ""+str.charAt(0);
 79         }
 80         return str.charAt(end) + reverse(str,end-1);
 81     }
 82 
 83     /**
 84      * fib(n) 斐波拉契数列 1 1 2 3 5 8 .....
 85      * 找重复:fib(n) = fib(n-1) + fib(n -2) --子问题
 86      * 找变化:变化的量应该作为参数 n。
 87      * 找边界:出口 终止的条件 n == 1 || n == 2
 88      */
 89     static int fib(int n){
 90         if (n == 1 || n == 2){
 91             return 1;
 92         }else {
 93             return fib(n-1)+fib(n-2);
 94         }
 95     }
 96 
 97     /**
 98      * gcd(m,n) 最大公约数 辗转相除法
 99      * 找重复:gcd(m,n) = gcd(n,m%n) --子问题
100      * 找变化:变化的量应该作为参数 n。
101      * 找边界:出口 终止的条件 n == 0
102      */
103     static int gcd(int m,int n){
104         if (n == 0){
105             return m;
106         }
107         return gcd(n,m%n);
108     }
109 
110     /**
111      * insertSort(arr,k) 递归实现插入排序
112      * 找重复:insertSort(arr,k-1) 将k-1个排序后,把arr[k]插入到前面的数据中 --子问题
113      * 找变化:变化的量应该作为参数 k。
114      * 找边界:出口 终止的条件 k == 0
115      */
116     static int[] insertSort(int[] arr,int k){
117         if (k == 0){
118             return arr;
119         }
120         //对前k-1个元素排序
121         insertSort(arr,k-1);
122         //把k位置上的元素插入到前面的部分
123         int x = arr[k];
124         int index = k -1;
125         while (index >= 0 && x <arr[index]){
126             arr[index+1] = arr[index];
127             index--;
128         }
129         arr[index+1] = x;
130         return arr;
131     }
132 }

 递归基础总结见博客:https://www.cnblogs.com/zsh-blogs/p/10385856.html

原文地址:https://www.cnblogs.com/zsh-blogs/p/10386049.html