递归:在程序中直接或间接调用自身的算法成为递归。
使用条件:
(1)明确递归的终止条件。
(2) 一个较为复杂的问题可以化为几个简单的相似小问题,以确保其可以调用前面的函数。
书写提示:可以先写出终止条件,之后再关注其中分解出的问题,使其成立,在问题的解决中就会让体现出会发现与已分解的问题相似,然后就使用递归思想。
在使用递归思想时不必明确每一步的步骤,在写程序时就一定要默认自己的递归成立,否则在复杂的递归中会思路混乱。
例如汉诺塔问题,如果想移动就是把n-1个圆盘放到B,第n个放到C之后,B上面的全放过去就ok。
对于B来说,B上面的n-2个圆盘又要放到A上,然后第n-1个放到C上,之后A上面的在放到C上就ok…如此循环下去,对于1个就只是输出A->C(这就是最简单问题,也是终止条件),所以输出只写A->C就可以了,在一步步递归中会输出B。
递归其本质就是将其大问题转化为层层套用的小问题并找到最方便的函数,然后再层层回溯。
经典递归题目:求最大公约数
//求m,n的最大公约数,规定m>n.
gcd (m,n){
if(n==0) return m;
else return (n,gcd(m%n));
}
//首先确定终止条件n等于0,之后层层分解。