您的位置:首页 > 职场人生

面试中常见递归题目 Java版

2011-09-23 12:12 459 查看
package math;

public class RevertANumber {

/*

* 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。

* */

static int find30(int n){

if (n <= 0)

return 0;

else if(n > 0 && n <= 2)

return 1;

return find30(n-1)+find30(n-2);

}

/*

* 将一整数逆序后放入一数组中(要求递归实现) Ex : 1234 变为 {4,3,2,1}

*/

static int revert(int rs[], int i, int number) {

if (i < rs.length) {

rs[i] = number % 10;

number = (number - number % 10) / 10;

return revert(rs, i + 1, number);

} else {

return 0;

}

}

/*

* 递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)

*/

static boolean loopWord(String str, int i) {

if (str.charAt(i) == str.charAt(str.length() - 1 - i)) {

if (i == (str.length() + 1) / 2)

return true;

return loopWord(str, i + 1);

} else {

return false;

}

}

/*

* 分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)

*/

static int dividePrimeToFactors(int num, int factor) {

while ((factor < num) && (num % factor != 0))

factor++;

System.out.print(factor + " ");

num = num / factor;

if (factor >= num)

return factor;// 结束判断

return dividePrimeToFactors(num, factor + 1);

}

public static void main(String[] args) {

System.out.println(find30(30));

int number = 1234;

int[] rs = new int[(number + "").length()];

revert(rs, 0, number);

for (int i = 0; i < rs.length; i++) {

System.out.print(rs[i]);

}

System.out.println(loopWord("1234321", 0));

dividePrimeToFactors(435234, 2);

}

}

================================================================================

//递归 寻找迷宫出路

package math;

public class Maze {

int MAX_SIZE = 8;

int h[] = { 0, 1, 0, -1 };

int v[] = { -1, 0, 1, 0 };

// 这样组成了向周围4个方向 依次是 ← ↓ → ↑

char Maze[][] = {

{ 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' },

{ ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X' },

{ 'X', ' ', 'X', 'X', ' ', ' ', ' ', 'X' },

{ 'X', ' ', 'X', 'X', ' ', 'X', 'X', ' ' },

{ 'X', ' ', 'X', 'X', 'X', 'X', 'X', 'X' },

{ 'X', ' ', 'X', 'X', ' ', ' ', ' ', 'X' },

{ 'X', ' ', ' ', ' ', ' ', 'X', ' ', ' ' },

{ 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' } };

void FindPath(int X, int Y) {

if (X == MAX_SIZE || Y == MAX_SIZE) {//表明指针已经移动到边缘 准备输出

for (int i = 0; i < MAX_SIZE; i++) {

for (int j = 0; j < MAX_SIZE; j++) {

if (j < MAX_SIZE - 1) {

System.out.print(Maze[i][j] + " ");

} else {//到达列末尾 准备换行

System.out.println(Maze[i][j]);

}

}

}

} else {

checkAround(X, Y);

}

}

void checkAround(int X, int Y){

//把寻找周围4个路径放在前面 这样可能不好理解

// for (int k = 0; k < 4; k++) {//上下左右四个方向扫描

// if (X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE

// && ' ' == Maze[X][Y]) {

// Maze[X][Y] = '.';

// FindPath(X + v[k], Y + h[k]);// 检查周围4个方向是不是也是o

// Maze[X][Y] = ' ';

// }

// }

if (X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE

&& ' ' == Maze[X][Y]) {

Maze[X][Y] = '.';

for (int k = 0; k < 4; k++) {

FindPath(X + v[k], Y + h[k]);// 检查周围4个方向是不是也是o

}

Maze[X][Y] = ' ';//沿着路线走 最终有的路可能是走不通 标记回来

}

}

public static void main(String[] args) {

Maze maze = new Maze();

maze.FindPath(1, 0);// 从 Maze[1][0]进入

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: