java :基本递归(阶乘,斐波那契数列,猴子吃桃,迷宫,汉诺塔,八皇后)

1)求一个非负数的阶乘

package ex;
import java.util.*;
public class ex1 {
	public static void main (String args[]) {
	Scanner myscanner = new Scanner(System.in);
	System.out.println("please input a number:");
	int n = myscanner.nextInt();
	T t = new T();
	if(t.factorial(n)==-1)
		System.out.println("请输入非负数求阶乘");
	else
		System.out.println( n+"的阶乘为"+t.factorial(n));
	}
}
class T{
	public int factorial(int n) {
		if(n>0)
		{
			if(n>1) 
			return factorial(n-1)*n;
		else
			return 1;
		}
		else
			return -1;
	}
}

2)斐波那契数列

package ex;
import java.util.*;
public class ex2 {
	public static void main(String args[]) {
		Scanner myscanner = new Scanner(System.in);
		System.out.println("please input a number:");
		int n = myscanner.nextInt();
		method AA = new method();
		if(AA.fibonacci(n)==-1)
			System.out.println("非正数不满足题意");
		else
			System.out.println("第"+n+"个数是"+AA.fibonacci(n));
		
	}
}
class method {
	public int fibonacci(int n) {
		if(n>0)
		{
			if(n==1||n==2) 
				return 1;
			else
				return fibonacci(n-1)+fibonacci(n-2);
		}
		else
			return -1;
		}
}

3)猴子吃桃问题:有一堆桃子,猴子第一天吃了其中一半,并再多吃了一个,以后的每天猴子都吃其中的一半,然后再多吃一个,当到第10 天时,想再吃时(即还没吃),发现只有一个桃子了,问最初有多少桃子?            1534个

package ex;
import java.util.*;
public class ex3 {
	public static void main(String args[]) {
		Scanner myscanner = new Scanner(System.in);
		System.out.println("please input a number:");
		int day = myscanner.nextInt();
		SS M = new SS();
		if(M.peach(day)==-1)
			System.out.println("天数不满足题意");
		else
			System.out.println("第"+day+"天还有"+M.peach(day)+"个桃子");
		
	}

}
class SS{
	public int peach(int day) {
		if(day>=1&&day<=10) {
			if(day==10)
				return 1;
			else
				return (peach(day+1)+1)*2;
			}
		else
			return -1;
	}
}

注:逆推思维,从第10天的一个桃开始往前推。

4)迷宫问题

package ex;

public class ex4 {
	public static void main(String args[])
	{
		int a[][]=new int[8][7];//8行7列的地图
		for(int i =0;i<7;i++)//设置障碍,其中1代表不能走,0代表能走,
			{//代表在地图四周设置上障碍
				a[0][i]=1;
				a[7][i]=1;
			}
		for(int j=0;j<8;j++) {
			a[j][0]=1;
			a[j][6]=1;
		}
		System.out.println("======地图为=====");
		for(int i=0;i<a.length;i++)
		{
			for(int j =0;j<a[i].length;j++)
			{
				System.out.print(a[i][j]);
			}
			System.out.println("");
		}
        R t = new R();
		t.findway(a,1,1);
		System.out.print("======可走路径如下=====");
		
		for(int i=0;i<a.length;i++)
		{
			for(int j =0;j<a[i].length;j++)
			{
				System.out.print(a[i][j]);
			}
			System.out.println("");
		}
	}

}
class R{
	public boolean  findway(int a[][],int x,int y ) {//a[][]代表这个地图,x,y表示起始位置
		if(a[6][5]==2)//2代表能走,已经走过,3代表不能走通,已经走过
			return true;
		else
		{
			if(a[x][y]==0)
			{
				a[x][y]=2;
				if(findway(a,x+1,y))//设置了下一步走的方向的优先级是:下->右->上->左
					return true;
				else if(findway(a,x,y+1))
					return true;
				else if(findway(a,x-1,y))
					return true;
				else if(findway(a,x,y-1))
						return true;
				else 
				{
					a[x][y]=3;
					return false;
				}
				
			}
			else 
				return false;
		}
	}
}

5)汉诺塔问题

package ex;
import java.util.Scanner;
public class ex5 {
	public static void main (String args[]) {
		Scanner myscanner = new Scanner(System.in);
		System.out.println("please input a number:");
		int n = myscanner.nextInt();
		tower t = new tower();
		t.move(n,'a','b','c');
	}
}
class tower{ 
	public void move(int n,char A,char B,char C) {//n个盘子
		if(n==1)
			System.out.println(A+"->"+C);
		else {
			move(n-1,A,C,B);//将n-1个盘子先移到B上
			System.out.println(A+"->"+C);//再把最下面的盘子移到C上
			move(n-1,B,A,C);//然后再把B上的n-1个盘子移到C上
		}
	}
}

6)八皇后问题

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。在计算机问世后有更多的方法。

package eclipse;
public class queen01 {
	public static void main(String args[]) {
		Q q=new Q();
		q.put(0);
		System.out.print("共有"+q.count+"种摆放结果");
	}

}
class Q{
	int max=8;
	int count=0;
	/*public Q(int max)
	{
		this.max=max;//我有疑惑为什么不可以用构造器初始化max??
	}*/
	int a[] = new int[max] ;
	public void print() {//打印出摆放结果
		for(int i=0;i<a.length;i++)
		{
			System.out.print(a[i]+" ");
		}
		count++;
		System.out.println();
	}
	public boolean judge(int n) {//判断第n个皇后在第n行的位置
		for(int i=0;i<n;i++) {
			if(a[n]==a[i]||Math.abs(a[n]-a[i])==Math.abs(n-i))
				return false;
		}
		return true;	
	}
	public void put(int n) {//确定第n个皇后的位置
		if(n==max) {//
			print();
			return;
		}
			for(int i=0;i<max;i++) {
				a[n]=i;
				if(judge(n))
					put(n+1);
			}
			
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值