Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12972
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-01 16:24
个人简介

简简单单学习,快快乐乐生活。。。。

文章存档

2017年(1)

2016年(4)

2015年(8)

分类: Java

2016-08-28 20:32:28

递归方法【recursive】  是指方法直接或间接的调用自己的过程。

递归中最常用的就是递归算法
                 
是把问题转化为规模缩小了的同类问题的子问题。
           然后
函数(或过程)来表示问题的解。
            
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).

递归是解决一些“特殊问题域”的思想,因为这些问题域存在一下条件

1.    有退出机制

2.    有规律

从这两条可以看出,这与循环的思想很类似,所以,有些循环本身就可以使用递归来完成。

如:求整数的阶乘,可以做如下对比。

//loop code

public long factor(int n){

  Long result=1L;

//loop

  for(int i=n;i>=1;i--){

   result*=i;

}

return result;

}

//Recursive code

public long factor(int n){

//退出机制

Ifn==1{

  return 1L;

}

//递归

return n*factor_2(n-1);

}
    最常见的就是,用递归算法解决,汉诺塔问题:
 
 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)
有一个人想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。
在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。
   

总结规律如下:(参考)

  • 如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。
  • 如果有3个盘子,那么根据2个盘子的结论,可以借助c将盘子1上的两个盘子从A移动到B;将盘子1从A移动到C,A变成空座;借助A座,将B上的两个盘子移动到C。这说明:可以借助一个空座,将3个盘子从一个座移动到另一个。
  • 如果有4个盘子,那么首先借助空座C,将盘子1上的三个盘子从A移动到B;将盘子1移动到C,A变成空座;借助空座A,将B座上的三个盘子移动到C。
  • 代码实现:
  • //code

    Public void hanoiTower(int disks,char a,char b,char c){

          //制定退出条件

          If(disks=1){

         System.out.printf(“碟子[%d],%s移动到%s\n”,disks,a,c);

    }else {

            //递归调用

             haoiTower(disks-1,a,c,b);

            //输出ac

         System.out.printf(“碟子[%d],%s移动到%s\n”,disks,a,c);

    //继续递归

    haoiTower(disks-1,b,a,c);

    }

    }


阅读(382) | 评论(0) | 转发(0) |
0

上一篇:java常见异常类(1)

下一篇:前端学习

给主人留下些什么吧!~~