如何写递归函数
2013-10-31
一句话搞掂.
如果一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的,那么这个函数就是递归函数.理解了我这句话,递归算法的应用就不是问题了.
写递归函数第一步是分析问题,分析问题是否存在"一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的"这种关系,如果存在,使用递归函数必定是成功的,因为它就是递归函数的定义的阐发.
看我分析最经典的汉诺塔问题:
将n个盘从第1个柱子移到第3个柱子需要三步完成,换句话说,这个移盘函数---用f来表示,它由三步完成.
将n-1个盘从第1个柱子移到第2个柱子.
将1个盘从第1个柱子移到第3个柱子
将n-1个盘从第2个柱子移到第3个柱子.
关键的地方到了,如果一个函数里面包含了一个步骤,这个步骤的里面的步骤是和这个函数的所有步骤是一致的,
看第1个步骤,将n-1个盘从第1个柱子移到第2个柱子,我们暂时用g来表示,等下你会发现f=g的.
这个步骤也是由3个步骤来完成的:
1.将n-2个盘从第1个柱子移到第3个柱子.
2.将1个盘从第1个柱子移到第2个柱子
3.将n-2个盘从第3个柱子移到第2个柱子.
首先"将n-1个盘从第1个柱子移到第2个柱子" 是 "将n个盘从第1个柱子移到第3个柱子" 的一个步骤.
其次"将n-1个盘从第1个柱子移到第2个柱子" 这个步骤 包含的步骤 是和 "将n个盘从第1个柱子移到第3个柱子"这个函数的步骤是一致的(都是三步),只是柱子的位置不同而已,这里的位置和函数的参数是等价的,因此,位置不同,就是函数参数值不同而已,函数的参数个数就等价于柱子的个数.换句话说,f和g的步骤和参数是一致的,只是实参不同而已,因此f=g的.这里面涉及到一点抽象思维,只能靠自己去理解了.
因此,如果用f(n,a,b,c)表示将n个盘从第1个柱子移到第3个柱子的话,那么,将n-1个盘从第1个柱子移到第2个柱子,就可以用f(n-1,a,c,b)表示了,为什么?因为上述已经分析过了,步骤是一致的,参数的个数是一致的,只是参数的值不同而已.
我总结了一个最快完成递归函数的方法,做一道题大概5分钟左右.
当n时,需要的步骤,列出来
当n-1时,需要的步骤,列出来.
比较上述两者的共性:1.步骤是一致的,2.参数的个数是一致的
如果满足上述两者,就将n-1的步骤就n的步骤代替,这样就ok了.