|

楼主 |
发表于 2011-12-6 13:58:37
|
显示全部楼层
练家志 发表于 2011-12-6 11:54
不会用,怎么样将问题i转化为递归?非数值计算特难转化
这个问题好?我也常在想!怎么样将问题转化为递归处理?首先要先考虑什么样的问题能用递归处理,然后再考虑如何将问题转化为递归处理!
一般来讲,具有下面特点的问题可以用递归来处理:
(1)这样的问题通常可以分解成几个子问题,而且你必须先要求解它的这几个子问题,然后综合子问题的解才能得到原始问题的解。但这几个子问题的结构是和原始问题一样的,这几个子问题其实就相当于规模小点的原始问题。那怎么求解这几个子问题呢?又必须把这几个子问题分别分解成另外几个子问题。这样不断分解,当子问题的规模足够小时,就可以直接求出最小的子问题。这样,求出最小的子问题后 ,就可以逆推出原始问题的解了。
举个排序的例子(请允许我举个数值的例子,因为这个好举点):
将序列A{16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14}排序。
使用递归调用有下面的思路:
1,将这个序列A分成两个序列a,b
2,先给序列a排序,再给序列b排序,完了之后将两个排好序列的a和b,有序的合并起来。
这样我们会面临的问题是如何给a和b排序,于是我们也用上面的方法。比如给a排序:
1,将序列a分成两个子序列a1,a2
2,先给序列a1排序,再给序列a1排序,完了之后将两个排好序列的a1和a1,有序的合并起来。
就这样不断减小排序规模,当规模等于2或者1的时候,就可以不用分成两个序列那么麻烦,直接就可以排序了。得出最小序列的排序之后,因为递归函数特点的关系,会不断逆推出原始数列A的排序。
至于如何把问题转换为递归?
先要把实际问题用编程语言描述出来先吧,就是用数据类型来表示实际问题的数据信息,用数据结构类型来表示实际问题的逻辑关系。数值问题容易是因为用编程语言比较容易描述,非数值问题难是因为用编程语言描述起来不太习惯。关键还是要理解问题的逻辑关系,然后用编程语言把问题表示出来。重要的还是多练习,看多了应该自然就理解。
我也是不太懂,要考试了,所以就发贴当作复习巩固的机会。 |
|