• 递归(一)


    第一列:*
    第二列:**
    第三列:***
    第四列:****
    。。。
    求N列中 * 的个数?

    我们发现:
    1)最后一列,它的值是N。
    2)总个数 = N + 所有剩余列的和。

    public int triangle(int c) {
      return c + getCount(c - 1);
    }
    以上的代码是错误的,递归中必须有一个终止条件,否则会无限地递归下去,引发程序崩溃。

     1 public class Triangle {
     2 
     3     public int triangle(int c) {
     4         if (c > 0) {
     5             int i = c - 1;
     6             return c + triangle(i);
     7         }
     8         return 0;
     9     }
    10 
    11     public static void main(String[] args) {
    12         Triangle t = new Triangle();
    13         System.out.println(t.triangle(4));
    14     }
    15 
    16 }

    打印结果:
    10

    递归方法的特征:
    1)调用自身
    2)当它调用自身的时候,它这么做是为了解决更小的问题。
    3)存在某个足够简单的问题的层次,在这一层的算法中不需要调用自己就可以直接解答,且返回结果。

    变位字:

     1 public class Anagram {
     2 
     3     static int size;
     4 
     5     static char[] arrChar;
     6 
     7     static int count;
     8 
     9     public static void main(String[] args) {
    10         String input = "cats";
    11         arrChar = input.toCharArray();
    12         size = arrChar.length;
    13         doAnagram(size);
    14     }
    15 
    16     public static void doAnagram(int newSize) {
    17         if (newSize == 1) {
    18             return;
    19         }
    20         for (int i = 0; i < newSize; i++) {
    21             doAnagram(newSize - 1);
    22             if (newSize == 2)
    23                 display();
    24             rotate(newSize);
    25         }
    26     }
    27 
    28     public static void display() {
    29         System.out.print(++count + " : ");
    30         for (int i = 0; i < size; i++) {
    31             System.out.print(arrChar[i]);
    32         }
    33         if (count % 6 == 0) {
    34             System.out.println();
    35         }
    36         else {
    37             System.out.print("\t");
    38         }
    39     }
    40 
    41     public static void rotate(int newSize) {
    42         int j;
    43         int position = size - newSize;
    44         char temp = arrChar[position];
    45         for (j = position + 1; j < size; j++) {
    46             arrChar[j - 1] = arrChar[j];
    47         }
    48         arrChar[j - 1] = temp;
    49     }
    50 
    51 }

    打印结果:
    1 : cats     2 : cast     3 : ctsa      4 : ctas     5 : csat     6 : csta 
    7 : atsc     8 : atcs     9 : asct    10 : astc   11 : acts   12 : acst
    13 : tsca   14 : tsac   15 : tcas   16 : tcsa   17 : tasc   18 : tacs  
    19 : scat   20 : scta   21 : satc   22 : sact   23 : stca   24 : stac

    递归二分查找:递归的二分查找和非递归二分查找同样是大O效率 O(logN) ,递归的二分查找比较简洁一些,但速度可能会慢一些。

     1 public class OrderArray {
     2 
     3     private long[] array;
     4 
     5     private int maxLength;
     6 
     7     public OrderArray(int size) {
     8         array = new long[size];
     9         maxLength = 0;
    10     }
    11 
    12     //插入时判断大小,保证有序。
    13     public void insert(long l) {
    14         int i;
    15         for (i = 0; i < maxLength; i++) {
    16             if (array[i] > l) {
    17                 break;
    18             }
    19         }
    20         for (int j = maxLength; j > i; j--) {
    21             array[j] = array[j - 1];
    22         }
    23         array[i] = l;
    24         maxLength++;
    25     }
    26 
    27     //二分查找
    28     public int find(long key) {
    29         int lower = 0;
    30         int upper = maxLength - 1;
    31         int index;
    32         while (true) {
    33             index = (lower + upper) / 2;
    34             if (array[index] == key) {
    35                 return index;
    36             }
    37             else if (lower > upper) {
    38                 return -1;
    39             }
    40             else {
    41                 if (array[index] < key) {
    42                     lower = index + 1;
    43                 }
    44                 else {
    45                     upper = index - 1;
    46                 }
    47             }
    48         }
    49     }
    50 
    51     public int recFind(long key) {
    52         return recFind(key, 0, maxLength - 1);
    53     }
    54 
    55     //递归二分查找
    56     private int recFind(long key, int lower, int upper) {
    57         int index = (lower + upper) / 2;
    58         if (array[index] == key) {
    59             return index;
    60         }
    61         else if (lower > upper) {
    62             return -1;
    63         }
    64         else {
    65             if (array[index] < key)
    66                 lower = index + 1;
    67             else
    68                 upper = index - 1;
    69             return recFind(key, lower, upper);
    70         }
    71     }
    72 
    73     public void display() {
    74         for (int i = 0; i < maxLength; i++) {
    75             System.out.println("NO." + (i + 1) + " --> " + array[i]);
    76         }
    77     }
    78 
    79 }
     1     public static void main(String[] args) throws ParseException, InterruptedException {
     2         OrderArray array = new OrderArray(100);
     3 
     4         array.insert(49);
     5         array.insert(158);
     6         array.insert(81);
     7         array.insert(93);
     8         array.insert(18);
     9         array.insert(1);
    10         array.insert(9);
    11         array.insert(7);
    12         array.insert(81);
    13         array.insert(669);
    14         
    15         array.display();
    16         
    17         int key = 18;
    18         System.out.println(key + " is NO " + (array.recFind(key)+1));
    19     }

    打印结果:
    NO.1 --> 1
    NO.2 --> 7
    NO.3 --> 9
    NO.4 --> 18
    NO.5 --> 49
    NO.6 --> 81
    NO.7 --> 81
    NO.8 --> 93
    NO.9 --> 158
    NO.10 --> 669
    18 is NO 4

  • 相关阅读:
    导出报ora-31634、ora-31664
    A significant part of sql server process memory has been paged out
    解决ora-02429:无法用于删除强制唯一/主键的索引
    更改数据库表中有数据的字段类型NUMERIC(18,2)为NUMERIC(18,6)
    GHOST CLEANUP Process
    oracle查看执行计划explain plan FOR
    ORA-01502: 索引或这类索引的分区处于不可用状态
    mysql 游标循环,嵌套游标循环
    MSSQL FOR XML PATH ('')用法
    Mysql CHARINDEX用法
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2799255.html
Copyright © 2020-2023  润新知