Java——递归[第二次修订版]

相信大家都听过这么一个故事:从前有座山,山上有座庙,庙里有个老和尚在给一个小和尚讲故事,故事是什么呢?从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事是什么呢?从前有座山……

这个故事很长很长,有多长?这篇文章有多长就有多长。但是一整篇文章都在重复这个故事那这个博客还写个啥玩意儿。所以不妨写一个for循环?while循环或者do……while循环?但是循环到什么时候截止呢?1024次?2048次?或者是4096次?好像都是无休止的进行下去的。

构成递归需具备的条件:

1. 子问题须与原始问题做同样的事,且更为简单;

2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

对于第一点:子问题与原始问题做同样的事。

举例:6!

哦,就是这样了。现在我们来仔细分析一下问题。求6!

数学上6!= 6 * 5 * 4 * 3 * 2 * 1 = 720;

程序上变成了这样:

6 !

= 6 * get5()

= 6 * 5 * get4()

= 6 * 5 * 4 * get3()

=6 * 5 * 4 * 3 * get2()

=6 * 5 * 4 * 3 * 2 * get1()

= 6 * 5 * 4 * 3  * 2 *  1 

= 6 * 5 * 4 * 3  * 2

= 6 * 5 * 4 * 6

= 6 * 5 * 24

= 6 * 120

= 720

下面有两种方式

1.最笨拙的方法如下

public static int get6() {
	return 6 * 5 * 4 * 3 * 2 * 1;
}
public static int get5() {
	return 5 * 4 * 3 * 2 * 1;
}
public static int get4() {
	return 4 * 3 * 2 * 1;
}
public static int get3() {
	return 3 * 2 * 1;
}
public static int get2() {
	return 2 * 1;
}
public static int get1() {
	return 1;
}

2.对上面方法的改进,但这是毫无意义的改进。但是我们需要从上往下来铺垫思想。

public static int get6() {
	return 6 * get5();
}
public static int get5() {
	return 5 * get4();
}
public static int get4() {
	return 4 * get3();
}
public static int get3() {
	return 3 * get2();
}
public static int get2() {
	return 2 * get1();
}
public static int get1() {
	return 1;
}

这样我们就会发现,方法每个方法都类似,除了最后的get1()方法直接返回了一个确定的值,其他都是不确定的,在栈中该方法是这样的:

当执行到get1()时,该方法返回给get2方法一个1,然后弹栈,此时get2方法拿到get1()的返回值做计算之后,将得到的结果返回给get3(),以此下去……当方法get6()出栈之后,get6()方法将返回值返回给调用者,此时得到最终结果。

我们观看每个方法的结构,每个方法都是返回一个数与另一个方法 的乘积,那此时就可以将其归纳为一个方法。

public static int getFactorial(int x) {
	return x * getFactorial(x - 1);
}

但是,当执行到获取1的阶乘的时候却返回的是一个确定的值,此时就需要在方法中作判断操作,当传进去的参数等于1时,返回确定的值。其他数值的时候皆返回自身与下一个数的阶乘,例3:即return 3 * getFactorial(2)

public static int getFactorial(int x) {
	if (x == 1) {
		return 1;
	}else {
		return x * getFactorial(x - 1);
	}
}

以上就是对于java递归思想的简单研究。

如果对上面的思想掌握了,可以看看下面这个题型。

该题型过于简单,并且for循环这些是可以代替它的所以他不是典型的题型,且看另一个题型:

已知有一个数列:f(0) = 1,f(1) = 4,f(n + 2) = 2 * f(n + 1) + f(n),其中,n是大于0的整数,求f(10)的值。

那我们来分析一下题型:

f(10) = 2 * f(9) + f(8)

f(9) = 2 * f(8) + f(7)

f(8) = 2 * f(7) + f(6)

……

f(3) = 2 * f(2) + f(1)

f(2) = 2 * f(1) + f(0) 

f(2) = 2 * 4 + 1 = 9

f(3) = 2 * 9 + 4 = 22

f(4) = 2 * 22 + 9 = 53

……

f(10) = ?

当n = 0的时候返回1,当n = 1的时候返回4,……当n = 10 的时候返回,返回2 * f(9) + f(8)。

private static int getResult(int x) {
	if(x == 0) {
		return 1;
	}else if(x == 1) {
		return 4;
	}else{
		return 2 * getResult(x - 1) + getResult(x - 2);
	}
}

还有一个经典的题型,汉诺塔,欢迎大家研究研究,非常感谢。


好了,今天的博客就讲到这儿,感谢大家的品读。

大家好,我是轻言,我们下期,再会。


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章