递归与分治

1、递归求解阶乘函数

        阶乘函数可递归定义为:

        n!=\left\{\begin{matrix}n(n-1)! n>0; \\ 1 , n=0; \end{matrix}\right.

        代码:

public class Main1 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner input=new Scanner(System.in);
		while(input.hasNext()) {
			int n=input.nextInt();
			System.out.println(function(n));
		}
	}
	public static int function(int n) {
		if(n==0) {
			return 1;
		}
		else{
			return n*function(n-1);
		}
		
	}
}

2、Fibonacci数列

        数列可递归定义为:

        F(n)=\left\{\begin{matrix} 1,n=0,1 \\ F(n-1)+F(n-2),n>1 \end{matrix}\right.

        代码:

public class Main1 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner input=new Scanner(System.in);
		while(input.hasNext()) {
			int n=input.nextInt();
			System.out.println(function(n));
		}
	}
	public static int function(int n) {
		if(n==0||n==1) {
			return 1;
		}
		else{
			return function(n-1)+function(n-2);
		}
		
	}
}

3、整数划分问题

        在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m);

        整数划分可递定义为:

        q(n,m)=\left\{\begin{matrix}1,n=1,m=1 \\ q(n,n),n<m \\ 1+q(n,n-1),n=m \\ q(n,m-1)+q(n-m,m),n>m>1 \end{matrix}\right.

        代码:

public class Main {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
     Scanner input=new Scanner(System.in);
     while(input.hasNext()) {
         int n=input.nextInt();
         System.out.println(function(n,n));
     }
      
    }
    public static int function(int n,int m) {
        if(n<0||m<0) {
            return 0;
        }
        if(n==1||m==1) {
            return 1;
        }
        if(n<m) {
            return function(n,n);
        }
        if(n==m) {
            return 1+function(n,n-1);
        }
        else{
            return function(n,m-1)+function(n-m,m);
        }
     
    }
}

        备忘录法解决整数划分问题:

        代码:

        

public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner input=new Scanner(System.in);
        while(input.hasNext()) {
            int n=input.nextInt();
            int a[][]=new int [n][n];
            System.out.println(function(n,n,a));
        }
    }
    public static int function(int n,int m,int a[][]) {
        if(n<1||m<1) {
            return 0;
        }
         if(n==1||m==1) {
            return 1;
        }
         if(n==m) {
            if(a[n-1][n-2]==0) {
                a[n-1][n-2]=function(n,n-1,a);
            }
            return 1+a[n-1][n-2];
        }
        if(n>m) {
            if(a[n-1][m-2]==0) {
                a[n-1][m-2]=function(n,m-1,a);
            }
            if(a[n-m-1][m-1]==0) {
                a[n-m-1][m-1]=function(n-m,m,a);
            }
            return a[n-1][m-2]+a[n-m-1][m-1];
        }else
        return 0;
         
    }
}

4、汉诺塔问题

        代码:

        

public class Main {
    static int step;
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
     Scanner input=new Scanner(System.in);
     while(input.hasNext()) {
         int n=input.nextInt();
         step=0;
         hanoi(n,'A','B','C');
         System.out.println();//换行
          
     }
    }
    public static void move(int n,char a,char b) {
        System.out.println("第"+(++step)+"步:"+n+"号盘从"+a+"柱移至"+b+"柱");
         
    }
    public static void hanoi(int n,char A,char B,char C) {
        if(n>0) {
        hanoi(n-1,A,C,B);//把n-1个盘子从A柱借住C柱移动到B柱
        move(n,A,C);
        hanoi(n-1,B,A,C);
        }
    }
}

5、九数组分数问题

       问题表述:1, 2, 3...9 这九个数字组成一个分数,其值恰好为1/3,要求每个数字出现且只能出现一次,如何组合?编写程序输出所有的组合。

       输入:无

        输出:输出所有的结果,如果有多个,每条结果占一行。
结果的格式 : xxxx/xxxxx ,按照分子从小到大的顺序输出。

         代码:

public class Main {
     public static void main(String[] args) {
            // TODO Auto-generated method stub
             int[] a=new int[10];
                for(int i=1;i<=9;i++) {
                    a[i]=i;
                }
           Main main1=new Main();
           main1.t(a, 1, 9);
     }  
    public static void test(int [] a) {
        //四位数除五位数
        int x=(a[1]*1000+a[2]*100+a[3]*10+a[4])*3;
        int y=(a[5]*10000+a[6]*1000+a[7]*100+a[8]*10+a[9]);
        if(x==y) {
        for(int i=1;i<=9;i++ ) {
        System.out.print(a[i]);
        if(i==4) {
            System.out.print("/");
        }
        }System.out.println();
    }    
    }
    public static void t(int [] a,int k,int m) {
        if(m==k){
            test(a);
    }
        for(int i=m;i>=k;i--) {
            int x;
            x=a[m];
            a[m]=a[i];
            a[i]=x;
            t(a, k, m-1);
            int y;
            y=a[m];
            a[m]=a[i];
            a[i]=y;
            }    
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值