递归的应用

             作业一

1)使用组合数公式利用n!来计算

设计思想

先写出计算阶乘的函数,这个函数运用了递归的方法,

然后再根据公式求出组合数。

程序流程图

 

程序源代码

import java.util.Scanner;

 

public class Combination_N {

public static void main(String[] args)

{

    int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数

    Scanner scanner=new Scanner (System.in);

    while(true)

    {

    System.out.println("请输入组合数上边的数");

    if(scanner.hasNextInt())

       up_num=scanner.nextInt();

    System.out.println("请输入组合数下边的数");

    if(scanner.hasNextInt())

       down_num=scanner.nextInt();

    System.out.println(combin(up_num,down_num));

    }

}

public static int factorial (int n)//求N!

{

    if(n>1)

       return factorial(n-1)*n;

    else

       return 1;

}

public static int combin(int up,int down)//求组合数

{

    return factorial(down)/(factorial(up)*factorial(down-up));

}

}

 

程序截图

 

 

2)使用递推的方法用杨辉三角形计算

程序设计思想

创建二维数组,运用杨辉三角的思想递推求组合数

 程序流程图

 

源代码

    import java.util.Scanner;
public class Zuheshu3 {
        public static void main(String[] args)
        {
            Scanner scanner =new Scanner(System.in);
            int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数
            while(true)
            {
            System.out.println("请输入组合数上边的数");
            if(scanner.hasNextInt())
                up_num=scanner.nextInt();
            System.out.println("请输入组合数下边的数");
            if(scanner.hasNextInt())
                down_num=scanner.nextInt();
            System.out.print(Combination(up_num,down_num));
            }
        }
        public static int Combination(int up,int down)//计算组合数
        {
            int a[][]=new int[down+1][down+1];
            int i,j;
            for(i=0;i<=down;i++)
            a[i][0]=1;
            for(i=1;i<=down;i++)
                a[i][i]=1;
            for(i=2;i<=down;i++)
                for(j=1;j<i;j++)
                    a[i][j]=a[i-1][j]+a[i-1][j-1];
            return a[down][up];
        }
}

 

(3)使用递归的方法用组合数递推公式

 

设计思想

直接把所给的公式写成函数,并采取递归的方法,函数结束的条件是组合数的上下两个数相等,或者上变数是1

程序流程图

 

import java.util.Scanner;

public class YH_tri {

    public static void main(String[] args)

    {

       Scanner scanner =new Scanner(System.in);

       int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数

       while(true)

       {

       System.out.println("请输入组合数上边的数");

       if(scanner.hasNextInt())

           up_num=scanner.nextInt();

       System.out.println("请输入组合数下边的数");

       if(scanner.hasNextInt())

           down_num=scanner.nextInt();

       System.out.print(Combination(up_num,down_num));

       }

    }

    public static int Combination(int up,int down)//计算组合数

    {

       int Com;

       if(up==1)

           return down;

       else if(up==down)

           return 1;

       else

           return(Combination(up,down-1)+Combination(up-1,down-1));

          

    }

}

 

运行截图

 

 

 

作业2:递归编程解决汉诺塔问题

程序设计思想

经分析得移动每个盘子都需移动他的上边的盘子;由此产生递归的条件求组合数

程序流程图

程序源码

import java.util.Scanner;
public class Hanoi {
public static void main(String[] args)
{
    Scanner scanner=new Scanner(System.in);
    int num=1;
    System.out.println("请输入汉诺塔的层数");
    if(scanner.hasNextInt())
    {
        num=scanner.nextInt();
    }
    System.out.println("操作步骤如下(其中A表示起始塔,B表示借助的塔,C表示最终塔)");
    hanoi(num,'A','B','C');
}
public static void hanoi(int num,char one,char two,char three)//one表示起始塔,two表示移动过程借助的塔,three表示最终的位置塔
{
    if(num==1)
    {
        move(one,three);
    }
    else
    {
        hanoi(num-1,one,three,two);
        move(one,three);
        hanoi(num-1,two,one,three);
    }
}
public static void move(char from,char to)//from表示移动的初位置,to表示末位置
{
    System.out.println(from+"->"+to);
}
}

实验截图

作业3

设计思想

先确定字符串的长度,然后即可比较第一个和最后一个字符,然后再去掉原来字符串的首尾字符,在进行比较

程序流程图

程序源码

import java.util.Scanner;
public class Palindrome {
    public static void main(String[] args)
    {
        String str=" ";
        Scanner input =new Scanner(System.in);
        while(true)
        {
        System.out.println("请输入一段话");
        if(input.hasNext())
            str=input.next();
        if(huiwen(str))
        {
            System.out.print("这段话是回文");
        }
        else
            System.out.print("这段话不是回文");
        }
    }
    public static boolean huiwen(String str)
    {
        int len;
        len=str.length();
        if(len==1||len==0)
            return true;
        else if(str.charAt(0)==str.charAt(len-1))
        {
            
            return huiwen(str.substring(1, len-1));
        }
        else
            return false;
    }
}
实验截图

 

 

 

posted @ 2017-10-13 23:51  程序咖啡  阅读(836)  评论(0编辑  收藏  举报