2.力扣刷题心得(二)递归

(一)递归解释

(1)通俗来说,递归就是一个方法调用自己(当然会有终止条件)。

(2)递归所拥有的关键特征: 1、调用自身

                                        2、调用自身是为了解决更小的问题,当然这个小问题可以用自身的方法 

                                              解决。

                                        3、拥有终止条件,试想如果没有终止条件的话,程序会无限运行下去。

(3) 有很多问题可能使用循环比使用递归更加方便,所以不要一味地使用它。不过它从概念上简化了问题。

(4) 尽量不要再递归的方法中创建不必要的数组或其他变量。

(5) 递归算法一般在一些分治算法中应用的很好。(分治算法:把一个大问题分解成两个小问题,并分别解决这两个小问题,然后继续把小问题分成更小的问题。。。。。。)

(二)相关应用

若要使用递归算法,就要时刻记住要解决的问题是否可以分解成和原问题一样但规模更小的问题。

(1)使用递归实现二分法

// 使用循环实现的二分法

public int find(int[] nums, long searchKey) {
	int lowerBound = 0;
	int upperBound = nums.length - 1;
	int mid;
	
	while (true) {
		if (lowerBound > upperBound)
			return -1;
		mid = (lowerBound + upperBound) / 2;
		if (nums[mid] == searchKey)
			return mid;
		else if (nums[mid] > searchKey) {
			upperBound = mid - 1;
		}
		else {
			lowerBound = mid + 1;
		}
	}
}

//使用递归方法实现的二分法

public int find(int[] nums, long searchKey, int lowerBound, int upperBound) {
	int mid;
	if (lowerBound > upperBound)
		return -1;
	mid = (lowerBound + upperBound) / 2;
	if (nums[mid] == searchKey)
		return mid;
	else if (nums[mid] > searchKey) {
		return find(nums, searchKey, lowerBound, mid - 1);
	}
	else {
		return find(nums, searchKey, mid + 1, upperBound);
	}
}

(2)汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

如何用递归解决这问题?不妨这样想

如果我们把1,2,3移动到B杆上,然后把4移动到C杆上,再把B杆上的1,2,3移动到C杆上不就行了!!那如何移动1,2,3到B杆上呢?是不是感觉这个问题就是初始问题的子问题,那这是不是就是递归的思想?

class Solution {
	static int nDisks = 4;
    public static void doTowers(int topN, char from, char inter, char to) {
    // topN就是想要移动的盘子数量,from就是起始杆,inter是中介杆,to是目标杆
        if (topN == 1)
        	System.out.println("Disk 1 from " + from + " to " + to);
        else {
        	doTowers(topN - 1, from, to, inter);
        	System.out.println("Disk " + topN + " from " + from + " to " + to);
        	doTowers(topN - 1, inter, from, to);
        }
    }

    public static void main (String[] args) {
    	doTowers(nDisks, 'A', 'B', 'C');
    	
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值