构造递归并不容易

递归绝对没有我们想像中那么容易构造,虽然这一点很早以前就有所体会,但今天在用Java写一个全排列的程序时才有了更深刻的认识,决定记录下来。

题目是这样的:

“用1、2、2、3、4、5这六个数字,用Java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:”4”不能在第三位,”3”与”5”不能相连。 ”

思路非常简单,就先对给定的数字进行全排列,然后剔出不符合要求的就行了。所以这个题的关键是求全排列。记得以前写全排列的时候都是用一个非递归的蛮力算法,今天想试试以前见过的一个递归算法。递归的原理其实很简单:依次从给定的数中抽取一个,把它放到最前面,然后把剩下的再进行全排列即可。但是,真正写起代码来却不容易,说来惭愧,光是构造递归我就花了近一个小时。

我认为,构造递归的关键在于对以下三个问题的处理:

1. 传递什么样的参数才能使得递归顺利进行?

2. 递归过程用不用返回值,用的话返回什么样的值?

3. 递归的终点是什么?

经过几次尝试以后,我决定这样构造上面那个递归,传递的参数是进行全排的字符串,返回该字符串的全排列的一个Vector。 具体源代码见:http://wangcong.org/src/permute.java