递归

来源:互联网 发布:word mac版打印 编辑:程序博客网 时间:2024/05/04 06:16

所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。

对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。

  递归的三个条件:

边界条件

递归前进段

递归返回段

当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

   

使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)

public class Test01 {  

    public static voidmain(String[] args) {  

       System.out.println(f(5));  

    }  

      

publicstatic int f(int n) {

 

 

        if (1 ==n)   

           return 1;  

        else  

           return n*f(n-1);  

    }  

}

 

对代码的分析:

此题中,按照递归的三个条件来分析:

(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;

(2)递归前进段:当前的参数不等于1的时候,继续调用自身;

(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*f(4),即5*f(5-1),即n*f(n-1)

 

 

 

递归的几个例子:

http://blog.sina.com.cn/s/blog_764d0ba60101cwo5.html

http://blog.csdn.net/lyjluandy/article/details/7717893/


package com.demo.recursion;

//所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。
// 提供几个递归实例,有的是从网上找的
// 1、十进制转换二进制
// 2、求1+2+3+...+n的和
// 3、求最大公约数
// 4、求汉诺塔算法
public class Recursion {

 public static void main(String[] args) {
  decimalToBinary(103);//十进制转换二进制
  //System.out.println(sum(100));// 求和
  // yueshu(12, 8); //求最大公约数
  // hanon(4, 'A', 'B', 'C'); //求汉诺塔算法
 }

 // 递归方法decimalToBinary,把一个十进制数转换成二进制数
 public static void decimalToBinary(int num){
  if (num == 0) { //当num=0时,循环结束
   return;
  } else {
   decimalToBinary(num/ 2); // 调用递归方法
   System.out.print(num% 2);
  }
 }

 // 递归方法sum,求 1+2+...+n 的求和
 public static int sum(int num) {
  if (num > 0){
   return num +sum(num - 1); // 调用递归方法
  } else {
   return 0; //当num=0时,循环结束
  }
 }

 // 递归方法yueshu,求两个数的最大公约数,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。
 public static void yueshu(int num1, int num2){
  if (num1 == num2) {
   System.out.println(num1);// num1=num2时,结束
  } else {
   yueshu(abs(num1- num2), min(num1, num2)); // 调用递归方法
  }
 }

 // 求两个数绝对值
 public static int abs(int num) {
  return num > 0 ?num : -num;
 }

 // 求两个数较小者
 public static int min(int num1, int num2) {
  return num1 >num2 ? num2 : num1;
 }

 // 递归方法hanon,求汉诺塔算法
 public static void hanon(int n, char a, char b,char c) {
  if (n == 1) {
   move(1, a,c);// 最后一种情况是,把A柱子上盘子移到C柱子上。
   return;
  }
  hanon(n - 1, a, c, b); //递归,把n-1个盘子从A 盘上借助C盘移到B盘上
  move(n, a, c);//调用move()方法
  hanon(n - 1, b, a, c);//递归,把把n-1个盘子从B盘上借助A盘移到C盘上
 }

 public static void move(int n, char a, char c){
  System.out.println(n + ":" + a+ "-->" + c);// 打印移动盘子情况
 }
}


0 0
原创粉丝点击