数据结构与算法之递归算法和分治算法

3.递归

1.定义

简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁

2.应用

  • 各种数学问题如: 8 皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google 编程大赛)
  • 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等
  • 将用栈解决的问题–>递归代码比较简洁

3.递归需要遵守的重要规则

  • 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
  • 方法的局部变量是独立的,不会相互影响, 比如 n 变量
  • 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
  • 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError,死龟了:)
  • 当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

4.分治算法

1.分治思想

分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解原问题的解即子问题的解的合并

2.基本步骤

  1. 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
  2. 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
  3. 合并:将各个子问题的解合并为原问题的解

3.设计模式

4.实践—汉诺塔

三个柱子,第一个柱子上按大小顺序放着64片金片,一次移动一片,全部移动到第三根柱子上,大的不能放在小的上面

	ArrayList a1,a2,a3;		//利用ArrayList实现栈的效果
	int count;			//金片数量
	
	move (fill(a1,count),a2,a3,count);  //调用
	
	public ArrayList fill(ArrayList origin,int count){		//填充数组
        for(int i=conut;i>0;i--){
            origin.add(i);
        }
        return origin;
    }
	public void move(ArrayList origin,ArrayList temp,ArrayList target,int count){
        if(count==0) {		//边界条件
            move2(origin,target);
            return;
        }
        move(origin,target,temp,conut-1);	//A--->B
        move2(origin,target);				//A--->C
        move(temp,target,origin,count-1);	//B--->C
    }
	punlic void move2(ArrayList origin,ArrayList target){		//一个数据第一个栈出栈,放入第二个栈
        int temp = origin.get(origin.size());
        origin.remove(origin.size());
        target.add(temp);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值