您的位置:首页 > 其它

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

2016-02-28 11:34 387 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: