数据结构之递归


递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

在谷歌搜索中由这样的彩蛋。

满足条件

  1. 一个问题的解可以分解为几个子问题的解
  2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  3. 存在递归终止条件

秘诀

写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

案例

斐波那契数列

public class PrintFib {
    
    public static int fib(int num) {
        if(num == 1 || num == 2) {
            return 1;
        }else {
            return fib(num - 2) + fib(num - 1);
        }
    }
    
    public static void main(String[] args) {
        
        for(int i = 1;i <= 10;i++) {
            System.out.print(fib(i) + "\t");
        }    
    }    
}

汉诺塔

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石]柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

图片来源:https://www.zhihu.com/question/24385418

import java.util.Scanner;
 
public class Hanoi {
    static long s = 0;
 
    public static void main(String args[]) {
 
        int n = 0;
        System.out.println("请输入汉诺塔的层数:");
        Scanner console = new Scanner(System.in);
        n = console.nextInt();
        System.out.println("汉诺塔层数为" + n);
        System.out.println("移动方案为:");
        hanoi(n, 'a', 'b', 'c');
        System.out.println("需要移动次数:" + s);
 
    }
 
    static void hanoi(int n, char a, char b, char c) { //a为初始塔,b为中间塔,c为目标塔
        if (n == 1){  
            System.out.println("n=" + n + " " + a + "-->" + c);  
            s++;
        }
        else{  
            hanoi(n-1,a,c,b);
            System.out.println("n=" + n + " " + a + "-->" + c);  
            hanoi(n-1,b,a,c);  
            s++;
        }
    }
}


文章作者: 清风笑丶
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 清风笑丶 !
 上一篇
数据结构之二叉树 数据结构之二叉树
树树(Tree)是n(n$\geq$0)个节点的有限集,当n=0时称为空树。在任意以可非空树中: 有且只有一个特定的根(Root)节点; 当n$\geq$0的时候,其余节点分为m(m>0)个互不相交的有限集$T_{1}$
2019-05-07
下一篇 
数据结构之链表 数据结构之链表
链表数组要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的存储空间 时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。链表恰恰相反,它并不需要一块连续的内存空间,它
2019-05-04
  目录