似乎学校学程序的过程都要经过学习递归这节课,上完课下来,一些简单的递归,例如求阶乘,N个数的和等比较简单的递归会写,可能本人没有什么数学头脑,涉及到例如汉诺塔,数的排列与组合等比较复杂的问题的时候就写不出来了,有时候写不出结束条件,更多时候是写不出递归函数的执行,估计递归这东西永远成为我克服不了的困难了,在这里想请教下大家当时学递归是怎么学的啊?现实编程中用递归用的多么?谢谢~
调试欢乐多
现实中用的不少,像windows里的资源管理器的树,从数据库读出来不用递归没法搞,不过大都不是特别复杂
你還是不要先管什麼遞歸的什麼條件不條的,你知道遞歸就是調用自己
以漢諾塔為例,假如你的函數叫move,那麼你只要知道你想做什麼就可以了,
move(n - 1, a, c, b) <---由將a塔上的n-1層經c移到b
pick(n, c) <---將n放到c上
move(n - 1, b, a, c) <---同上
涉及到集合又几乎必然涉及到递归
一个堡垒久攻不下就应该想想怎么包抄它:
先从递归的周边知识和技能下手:
数学基础——数学归纳法
代码方面——栈本身、怎么自己用栈去处理算术表达式
其他——买个汉诺塔玩具玩玩
最后——递归语法:
递归函数(n){
if(到达递归终止条件){return 最简返回值;}
else{递归函数(n-1);}
}
题目其实是要求写一个实现快速排序法的代码,但是跟教材上要求有所不一样,我对题目做了些简化,如下:
要求用三个方法LESSTHAN(),EQUAL(),MORETHAN()分别找出一个数组中比中间那个数小,等于中间那个数,比中间那个数大的数,并且把找出来的数放到三个不同的数组里面,三个方法的返回值是数组类型,然后最后在QUICKSORT()中用上面那个三个方法,并且递归调用QUICKSORT()这个方法,来实现这个快速排序的算法.
我思考了一下写出了半个QUICKSORT的方法,如下:
public int [] Quicksort(int[] f){
LessThan(f);
Quicksort(f);
Equal(f);
Morethan(f);
Quicksort(f);
} 这里我没有写到递归终结条件,这里想请教下大家,应该怎么写才正确,还有,如果撇开终结条件,我这样的递归思想正确吗?谢谢