• 蓝桥学院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

  • 相关阅读:
    JDK内置工具使用
    awk 数组
    c++面试题
    C++内存分配
    awk 数字比较
    awk脚本 排序
    awk 读取 shell 变量的方法
    NVelocity系列:Getting Start With NVelocity
    Castle.ActiveRecord分页示例
    NVelocity系列:NVelocity配置详解
  • 原文地址:https://www.cnblogs.com/zsh-blogs/p/10386049.html
Copyright © 2020-2023  润新知