`

最近正准备找工作呢,熟悉下递归算法,做了几个递归的例子包括汉诺塔问题

阅读更多
package junit.test;

import java.util.Arrays;

import org.junit.Test;


public class excise {
    
    private int[] initArray = {8,2,56,23,14,3,29,88,23,36};
    
    //递归的应用求年龄问题
    /*
     * 用递归算法算出第1个人的年龄为10,第8个人的年龄是多少
     */
    @Test
    public void testLoop() {
        //调用算第8个人的年龄的函数
        int age = getAge(8);
        System.out.println(age);
    }
    /**
     * 算法:第n个人的年龄是第8个人的年龄(getAge(7))+2
     * 所以可知:第n个人的年龄是第n-1个人的年龄(getAge(n-1))+2
     * 知道最后返回第一个人的年龄为10
     * @param index
     * @return
     */
    public int getAge(int index) {
        if(index == 1) return 10;
        return getAge(index - 1) + 2;
    }
    
    
    //递归算1-105的和
    @Test
    public void recursionTest() {
        System.out.println(recursion(105));
    }
    
    public int recursion(int num) {
        if(num == 1) return 1;
        return num + recursion(num-1);
    }
    
    //递归算一个数的2进制编码
    @Test 
    public void recirsionTest2() {
        System.out.println(binary(0));
    }
    
    public String binary(int arg) {
        if(arg < 2) return String.valueOf(arg);
        int temp = arg % 2;
        return binary(arg / 2) + String.valueOf(temp);
    }
    
    //汉诺塔问题
    /*
     * 汉诺塔问题是典型的应用递归的问题
     * 题目:桌面上有三个放盘子的地方,其中1号位置放了n个盘子,并且每个上面的盘子都比下面的盘子小,其他两个
     * 地方是空的,要求把1号位置上的盘子全部搬到3号位置上,每次只能搬一个,并且,大盘子不能放到小盘子上。可
     * 以借用2号位置。
     * 
     * 我们假设已经把1号上面的n-1个盘子搬到2号位置上了
     * 接着我们把n盘子搬到3号位置上
     * 然后把2号位置的盘子搬到3号位置上就完成任务了
     * 
     * 
     */
    private int[] hnotaArray = {2, 3, 8, 14, 23, 23, 29, 36, 56, 88};
    @Test
    public void testHnota() {
        int[] hA = hnotaArray;
        try {
            hnota(hnotaArray, 'f', 't', 'l');
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }
    public void hnota(int[] x, char a, char b, char c) {
        // 当只有一个盘子的时候直接把盘子从1号盘子直接把到3号盘子上
        if(x.length == 1) { 
            move(x[0], a, c);
            return;
        }
        //把上面的n-1个盘子截取出来
        int[] y = new int[x.length - 1];
        for(int i=0; i<y.length; i++) {
            y[i] = x[i];
        }
        //把1号上面的n-1个盘子搬到2号位置上了
        hnota(y, a, c, b);
        //把n盘子搬到3号位置上
        move(x[y.length], a, c);
        //把2号位置的盘子搬到3号位置上就完成任务了
        hnota(y, b, c, a);
    }
    
    //把一个盘子从src搬到desc上
    public void move(int z, char src, char desc) {
        System.out.println("move " + z + " from " + src + " to " + desc);
    }
}


分享到:
评论
1 楼 fenshen6046 2010-06-29  
hnota(y, b, c, a); 
这句话错了
应该是
hnota(y, b, a, c); 

相关推荐

    汉诺塔的递归算法 C++

    用C++实现汉诺塔的递归算法,定义了类和方法。

    汉诺塔问题递归算法

    汉诺塔问题的递归算法,附详细代码以及运行结果,有详细的算法描述。

    汉诺塔问题的非递归算法

    为了在计算机上实现汉诺塔问题的非递归算法,可以采用结构体来表示每根柱子的状态,包含柱子上的圆盘序列、栈顶索引和柱子的名称等属性。通过构造`Creat()`函数来初始化圆盘的分布情况,进而通过`Hannuota()`函数...

    汉诺塔非递归算法实验报告

    汉诺塔问题是一个经典的计算机科学问题,通常使用递归算法来解决。然而,这个实验报告提出了使用非递归算法来解决汉诺塔问题的方法。非递归算法的关键在于找到一个可重复执行的步骤序列,而不是像递归那样通过自我...

    汉诺塔递归算法--C语言

    汉诺塔问题是一个经典的递归算法问题,它涉及到三个柱子(塔)和若干个大小不一的圆盘。在初始状态下,所有圆盘按照大小顺序堆叠在第一个柱子(1号塔)上,大的在下,小的在上。目标是将所有的圆盘从1号塔移动到2号...

    一个关于汉诺塔的非递归算法

    在提供的压缩包中,"汉诺塔非递归算法.doc"可能包含了详细的文字说明,解释了算法的思路和步骤,而"汉诺塔非递归算法.cpp"则是实际的C++源代码,你可以查看并运行这个程序来观察非递归算法如何解决汉诺塔问题。...

    c语言汉诺塔的递归算法

    汉诺塔游戏是一种经典的逻辑问题,它通过递归算法来解决。在这个游戏中,有三个柱子,分别标记为A、B、C,A柱上从下到上按大小顺序叠放着n个圆盘。目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,...

    汉诺塔问题的递归算法,很简单哦

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它很好地展示了递归思想在解决问题中的应用。在这个问题中,我们有3个柱子,分别标记为A、B、C,柱子A上叠放着n个大小不一的盘子,遵循“大盘在下,小盘...

    汉诺塔递归与非递归两种算法的代码与结果对比

    在你提供的文件中,"递归13.txt"可能包含了使用递归算法解决13个盘子的汉诺塔问题的代码。递归算法通常使用函数调用自身,形成一个树状结构,最终达到目标状态。 **非递归算法** 非递归算法,也称为迭代算法,通过...

    汉诺塔非递归算法

    总的来说,非递归汉诺塔算法提供了一种不同于传统递归解法的思路,它不仅有助于理解问题的本质,还能在某些情况下提高程序的性能。学习并理解这种算法对于提升编程思维和问题解决能力大有裨益。

    汉诺塔非递归算法 数据结构

    汉诺塔游戏是一个经典的计算机科学问题,源自印度的古老传说,目标是将所有盘子从一个柱子(称为起始柱)移动到另一个柱子(称为目标柱),但每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。非递归...

    汉诺塔的递归算法 C语言

    用C语言实现汉诺塔的递归算法,另外还有用栈来实现的方式:http://download.csdn.net/detail/jason19905/6419427

    c++递归实现汉诺塔问题

    汉诺塔问题是一个经典的计算机科学问题,源自印度的古老传说,它涉及到三个柱子和一堆大小不一的圆盘。目标是将所有圆盘从一个柱子(称为起始柱)移动到另一个柱子(称为目标柱),同时遵循以下三个规则: 1. 每次...

    C语言 汉诺塔小程序 递归算法

    在这个C语言实现的汉诺塔小程序中,主要运用了递归算法来解决这个问题。递归是编程中一种强大的技术,它通过调用自身来解决问题。在汉诺塔问题中,递归的核心思想可以这样描述:将大问题分解为若干个相同或相似的小...

    汉诺塔问题非递归算法的实现

    ### 汉诺塔问题非递归算法的实现 #### 1. 汉诺塔问题概述 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,在数学领域有着广泛的应用。该问题最初由法国数学家Édouard Lucas于1883年提出。汉诺塔问题涉及到三个...

    汉诺塔图形解法(递归算法)

    汉诺塔图形解法是利用递归算法来解决汉诺塔问题的一个经典示例。汉诺塔问题是指将一个由多个不同的圆盘组成的柱子从一个柱子移至另一个柱子,而圆盘的大小各不相同,且大的圆盘不能放在小的圆盘上面。汉诺塔图形解法...

    汉诺塔问题的非递归算法分析

    汉诺塔问题的非递归算法分析是一个有趣的算法分析。

    C#汉诺塔非递归

    在C#中,解决汉诺塔问题通常采用递归方法,但本话题探讨的是如何使用非递归算法,通过栈数据结构来解决。 非递归解决方案的核心在于模拟汉诺塔的移动过程,这通常涉及到两个辅助柱子和一个目标柱子。在C#中,我们...

    汉诺塔问题的非递归算法分析.doc

    汉诺塔问题的非递归算法分析 汉诺塔问题是计算机科学中一个经典的问题,旨在研究如何将盘子从一个塔柱移到另一个塔柱上,并保持盘子的大小顺序不变。该问题可以被描述为:有三个塔柱A、B和C,开始时A柱上有n个盘子...

Global site tag (gtag.js) - Google Analytics