数据结构(Java)——递归

原创 2015年11月18日 20:15:04

回忆的伤,挂在窗;曾经的梦,太忧伤。

1.递归的入门学习

    递归是一种功能强大的编程技术,能为某些问题提供优雅的解决方案。在各种数据结构的实现以及数据的查找和排序的处理中,递归特别有用。
    递归是一种编程技术,它利用一个方法来调用自身来满足整个作用。能够递归编程取决于能否递归的思考。
    任何递归定义都必须有一个非递归部分,这个非递归部分称为基本情形,它使得递归最终会终止。
    数学和数学公式常常会递归的表示。深刻理解递归,对于编程和解决一些逻辑上直接求解十分复杂的问题十分有效。

2.递归编程

举例说明:一个累加过程的java递归算法的实现。

package ds.java.ch08;
/** 
 * @author LbZhang
 * @version 创建时间:2015年11月18日 下午8:17:07 
 * @description 类说明
 */
public class SUMTest {
    public int sum(int num){
        int result=0;
        if(num==1){
            result=1;
        }else{
            result=num+sum(num-1);
        }
        return result;
    }

    public static void main(String[] args) {
        SUMTest sumt= new SUMTest();
        int sum=sumt.sum(10);
        System.out.println(sum);
    }

}

递归和迭代,递归是某些问题优雅恰当的解决方式,但是在某些问题中使用递归没有迭代显得直观。
所有问题都可以使用迭代解决,不过有些情况下使用递归太复杂了。
递归可以分为直接递归和间接递归。

3.递归的使用

3.1使用递归解决迷宫问题

/**
     * 递归的方式发现迷宫路径
     * @param row
     * @param column
     * @return
     */
    public boolean recursionTrvaverse(int row, int column) {

        boolean done = false;

        if (maze.valid(row, column)) {

            maze.tryPosition(row, column);///先表示当前的结点已经遍历

            if (row == maze.getRows() - 1 && column == maze.getColumns() - 1) {
                done = true; // the maze is solved
            } else {
                done = recursionTrvaverse(row + 1, column);// down
                if (!done) {
                    done = recursionTrvaverse(row, column + 1);// right
                }
                if (!done) {
                    done = recursionTrvaverse(row - 1, column);// up
                }
                if (!done) {
                    done = recursionTrvaverse(row, column - 1);// left
                }
            }
            //在正确的遍历路线上面能够形成一条路径
            if (done)
                maze.makePath(row, column);

        }

        return done;
    }

3.2使用递归解决汉诺塔问题

package ds.java.ch08;

/**
 * @author LbZhang
 * @version 创建时间:2015年11月18日 下午10:37:48
 * @description 汉诺塔类的核心实现
 * 
 */
public class TowersOfHanoi {

    private int totalDisks;// 盘子个数

    /**
     * Sets up the puzzle with the specified number of disks.
     * 
     * @param disks
     *            the number of disks
     */
    public TowersOfHanoi(int disks) {
        totalDisks = disks;
    }

    /**
     * Performs the initial call to moveTower to solve the puzzle. Moves the
     * disks from tower 1 to tower 3 using tower 2.
     */
    public void solve() {
        //借用2 从1 移动到3
        moveTower(totalDisks, 1, 3, 2);
    }

    /**
     * Moves the specified number of disks from one tower to another by moving a
     * subtower of n-1 disks out of the way, moving one disk, then moving the
     * subtower back. Base case of 1 disk.
     * 
     * @param numDisks
     *            the number of disks to move
     * @param start
     *            the starting tower
     * @param end
     *            the ending tower
     * @param temp
     *            the temporary tower
     */
    private void moveTower(int numDisks, int start, int end, int temp) {
        if (numDisks == 1)
            moveOneDisk(start, end);
        else {
            //将n-1个移动到辅助柱子
            moveTower(numDisks - 1, start, temp, end);
             //将第n个盘子从起始柱子 移动到 最终柱子
            moveOneDisk(start, end);
            //将n-1个从辅助柱子移动到目的柱子
            moveTower(numDisks - 1, temp, end, start);
        }
    }

    /**
     * Prints instructions to move one disk from the specified start tower to
     * the specified end tower.
     * 
     * @param start
     *            the starting tower
     * @param end
     *            the ending tower
     */
    private void moveOneDisk(int start, int end) {
        System.out.println("Move one disk from " + start + " to " + end);
    }

}

4.递归算法分析

递归算法的算法分析:在分析循环的时候,我们先判定循环体的序,然后再乘以该循环的执行次数。分析递归算法也用类似的思路。先判定递归的序(遵循递归定义的次数),再乘以递归方法体的序。

以计算整数累加(从1累加到某个正数)的递归方法为例。

public int sum(int num){
        int result=0;
        if(num==1){
            result=1;
        }else{
            result=num+sum(num-1);
        }
        return result;
    }

递归的方法体执行了一次加法计算其复杂度为O(1)。
每次调用递归算法时,num的值都会递减1,因此,这个递归方法被调用num次,因此递归的序为O(n)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java数据结构与算法之递归思维(让我们更通俗地理解递归)

汉诺塔的问题 数学归纳法的思维 递归算法的思考方式 斐波那契数列中的递归思想 再谈递归图形...
  • javazejian
  • javazejian
  • 2016年12月12日 11:50
  • 11062

JAVA数据结构之递归

JAVA数据结构之递归
  • laotou99
  • laotou99
  • 2010年07月29日 15:00
  • 872

数据结构与算法 -- 再论递归

之前在总结函数的时候,有讲过递归。参看:C语言再学习 -- 函数 正在看数据结构与算法分析,开篇就讲到递归,那现在就详细讲解下它吧...
  • qq_29350001
  • qq_29350001
  • 2017年02月09日 15:08
  • 1833

Java数据结构-线性表之栈的应用-递归及其应用

递归函数的定义:把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数(递归函数必须有一个结束的条件,以免陷入无穷尽的递归中)。迭代和递归的区别是: (1).迭代使用的是循环结构,...
  • yannanying
  • yannanying
  • 2015年08月27日 21:12
  • 743

数据结构(C语言版)-递归学习笔记

递归,介绍了解决某一类问题的思维方式。在一个函数定义中出现了对自己本身的调用,称为直接递归。一个函数p的定义中包含了对函数q的调用,而q的实现过程中又调用了p,即函数调用形成了一个环状调用链,这种方式...
  • zhonglj0314
  • zhonglj0314
  • 2015年04月19日 15:23
  • 1243

数据结构:递归

1.  递归的定义     递归方法就是直接或者间接的调用自己,它可以将一些发杂问题简化。     递归在下列方法中经常会用到:     (1)定义是递归的;     (2)数据结构是递归的;    ...
  • ding977921830
  • ding977921830
  • 2015年12月30日 19:12
  • 816

Java队列递归求解素数环问题

思路: 1.创建顺序表SqList的对象L,用于存放素数环中的数据元素; 创建链队列LinkQueue对象Q,用于存放还未加入到素数环中的元素。 2.初始化顺序表L和队列Q:将1加入到顺序表L中,...
  • dly215011
  • dly215011
  • 2016年10月31日 19:16
  • 720

严蔚敏-数据结构-递归算法总结

在看严蔚敏的数据结构视频,在32课时的时候,对递归算法进行了总结。在网上没找到对应的资料。而严蔚敏老师总结的又很不错,所以觉得有必要这里记录下(不是完全照搬,详细可以去找对应的视频)。一共有5点。  ...
  • cainiaohhf
  • cainiaohhf
  • 2013年12月19日 20:18
  • 3243

数据结构学习笔记(12.递归的应用之八皇后回溯算法)

本节知识点:1.递归与回溯:   a.回溯算法的基本思想:从问题的某一种状态出发,搜索可以到达的所有状态。当某个状态到达后,可向前回退,并继续搜索其他可达状态。当所有状态都到达后,回溯算法结束!   ...
  • qq418674358
  • qq418674358
  • 2014年04月16日 23:17
  • 4389

dijkstra算法的java实现

算法思想: 贪婪算法的一个例子。主要是找到该阶段的一个最优解。首先把结点分为两拨,open(未计算出最小路径的结点),close(已经计算出最小路径的结点)。每次我们都从start结点的子节点中找到一...
  • tingting256
  • tingting256
  • 2016年01月05日 11:12
  • 480
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——递归
举报原因:
原因补充:

(最多只允许输入30个字)