1.递归:程序调用自身的编程技巧称为递归(recursion)
2.定义一个过程或方法时出现调用本过程或本方法的成分,称之为递归
3.若调用本身称之为直接递归
4.若过程或方法A调用过程或方法B,而B又调用A,则称之为间接递归
5.在算法设计中,任何间接递归算法都可以转换为直接递归算法来实现,
所以主要讨论直接递归
6.如果一个递归过程或递归方法中递归调用语句是最后一条执行语句,称为尾递归
7.构成递归具备的条件:
①.子问题与原始问题为同样的事,且更为简单
②.不能无限制地调用本身,须有个出口,化简为非递归状况处理
例题1:阶乘5
public class Test(){
public static void main(String []args){
System.out.println(f(5));}
public int f(int n){
if(n ==1){
return 1;}else{
return f(n-1)*n;}
}
}
例题2:斐波那契数列(很多数学公式,数列定义是递归的)如n!和Fibobacci
int fib(int n){
if(n==1||n==2){
return 1;}else{
return fib(n-1)+fib(n-2);}
}
例题3:单链表(递归数据结构)
class LinkNode<E>{
E data;
LinkNode<E> next;//下一个节点指针
public LinkNode(){//构造方法
next =null;}
public LinkNode(E d){//重载构造方法
data = d;
next = null;}
}
例题4:单链表data成员之和
分为第一节点和后面n-1个节点的和
public static int sum(LinkNode<Integer> p){
if(p==null){return 0;}else{return p.data+sum(p.next);}}
例题5:汉诺塔问题
第一步:以C盘为中介,从A杆将1至n-1号盘移动至B杆
第二步:以A杆中剩下的第n号盘移动至C杆
第三步:以A杆为中介;从B杆将1-(n-1)号盘移动至C杆
public class recursion{
public static void main(String []args){
f(4,'1','2','3');//4表示4层,字符1,2,3表示三个塔的名字
System.out.prinln(sum);}
public static void f(int n,char X,char Y,char Z){
if(n==1){
System.out.println("move:"+X+"->"+Z);
sum++;
return;}
f(n-1,'X','Z','Y');//把X塔上1-(n-1)块,以Z为中介,移到B塔
f(1,'X','Y','Z');//把X塔上面的一块,移到Z塔上
f(n-1,'Y','X','Z');}//把Y塔上面的1-(n-1)块,通过X塔移到C塔
}
8.一般地,一个递归模型是由递归出口和递归体两部分组成
①递归出口确定递归到何时结束,即指出明确的递归结束条件
②递归体确定递归求解时的递推关系
小总结:递归其实就是定义一个方法来调用自身或与自身相近的一种思想
注意递归体里面是以什么为递归,还有递归的出口,一般是n==1为出口
将复杂的一步步通过递归简化成简单问题
在hanoi塔问题中,主要的就是三个hanoi方法中的实现
f(n-1,"塔A","塔C","塔B")//将塔A上面的n-1块移动到塔B上面,以塔C为中介
f(1,"塔A","塔B","塔C")//直接将塔A上面的一块移动到塔C上面
f(n-1,"塔B","塔A","塔C")//将塔B上面的n-1块移动到塔C上面,以塔A为中介
还是不怎么清楚怎么递归的