• 递归


    tips

    • 方法的第一条总是包含一个return的条件语句
    • 递归调用总是尝试去解决一个规模更小的子问题,这样递归才能收敛到最简单的情况
    • 递归调用的父问题和尝试解决的子问题之间不应该由交集

    一个有意思的递归,来自《算法》1.1.16 & 1.1.17

    //代码
    
    package chapter1;
    
    import java.util.Scanner;
    
    public class practice16 {
    
    	public static int exR1(int n) {
    		if (n <= 0)
    			return 0;
    		return exR1(n - 3) + n + exR1(n - 2) + n;
    	}
    	
    	public static String exR2(int n) {
    		if (n <= 0)
    			return "";
    		return exR2(n - 3) + n + exR2(n - 2) + n;
    	}
    
          /*  这个递归是死递归
              只能递归到发生StackOverflowerError(栈溢出异常)
              因为可以跳出的递归的return语句不是在第一句
    
            public static String exR3(int n) {
    	       return exR2(n - 3) + n + exR2(n - 2) + n;
                    if (n <= 0)
    			return "";
    		
    	}
       */
    
    	public static void main(String[] args) {
    		for (int i = 0; i < 3; i++) {
    			System.out.println("i:"+i+"	exR1:	"+exR1(i));
    			System.out.println("i:"+i+"	exR2:	"+exR2(i));
    		}
    		
    	}
    }
    
    结果:
    
    i:1	exR2:	11
    i:2	exR1:	4
    i:2	exR2:	22
    
    
    结果分析:以i=1为例:
    
            exR2(1 - 3) + 1 + exR2(1 - 2) + 1 
        =>  exR2(-2) + 1 + exR2(0) + 1;
        =>  ""+1+""+1
        =>   11

    递归最典型的例子:

    斐波那契数列:从第三位开始,每位都是前两位之和large x_{n} = x_{n-1} + x_{n-2}

    public class practice19 {
    	public static long f(int n) {
    		if (n == 0) {
    			return 0;
    		}
    		if (n == 1) {
    			return 1;
    		}
    		return f(n - 1) + f(n - 2); //递归调用自身
    	}
    
    	public static void main(String[] args) {
    		for (int i = 1; i < 14; i++) {
    			System.out.println(f(i));
    		}
    
    	}
    
    }
    
    结果:
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
  • 相关阅读:
    蓝桥杯之递归算法基本框架

    Dubbo是什么
    java
    java
    java
    java
    java
    负载均衡的理解
    设计模式学习
  • 原文地址:https://www.cnblogs.com/jeasion/p/10758331.html
Copyright © 2020-2023  润新知