递归课时作业

一.使用组合数公式利用n!来计算

1.程序设计思想

(1)   在主函数中输入n和k的值

(2)   判断输入的数是否合法

(2)   创建一个方法,public static BigInteger JiechengN2(int n),在此方法中利用递归,先判断n是否等于0或1,若是,则直接返回BigInteger.valueOf(1)若不是,则返回BigInteger.valueOf(n).multiply(JiechengN2(n-1))。

(3)在主函数中调用方法,输出结果。

2.实验流程图

3.源程序代码

import java.math.BigInteger;
import java.util.Scanner;
public class Jiecheng 
{
    public static void main(String[] args) 
    {
        System.out.println("请输入N");
        Scanner input=new Scanner(System.in);//输入N的值
        int number=0,num=0;//对num,number初始化
        if(input.hasNextInt())//判断输入n的是否为整数
        {
            number=input.nextInt();//若为整数,输入number
        }
        else
        {
            System.out.println("你输入的数据有误");//否则显示输入的数据有误
        }
        System.out.println("请输入k");//判断输入k的是否为整数
        if(input.hasNextInt())
        {
            num=input.nextInt();
            System.out.println(number+"!"+"/"+num+"!"+"*"+(number-num)+"!="+JiechengN2(number).divide(JiechengN2(num).multiply(JiechengN2(num))));
        }
        else
        {
            System.out.println("你输入的数据有误");
        }
 
    }
    public static BigInteger JiechengN2(int n) //创建JiechengN2
    {
        if(n==1 || n==0)//判断n是否等于1或者n是否等于0;
        {
            return BigInteger.valueOf(1);
        }
        return BigInteger.valueOf(n).multiply(JiechengN2((n-1)));//n*(n-1)!
}

}

4.实验截图

 二.使用递推的方法用杨辉三角计算

1.程序设计思想

(1)输入n和k的值,创建一个二维数组,通过循环,在第一个循环里,定义i=1,在循环里嵌套循环,定义当j=0时,先判断j是否等于0或者i是否等于j,若成立则输出arr[i-1][j]=1,否则第i-1行j列的数等于第i-2行j列的数与第i-2行j-1列的数之和。最后输出结果。

2.程序流程图

3.源程序代码

import java.util.Scanner;
public class trangle
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("请输入n的值");//输入n的值
        int n=input.nextInt();
        System.out.println("请输入k的值");//输入k的值
        int k=input.nextInt();
        int arr[][]=new int[n+1][n+1];//定义一个一个二维数组,n+1行,n+1列
        for(int i=1;i<=n+1;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(j==0||j==i)//每一行的第一个数和该行的最后一个
                {
                    arr[i-1][j]=1;//此时i-1表示的是第一行
                }
                else
                {
                    arr[i-1][j]=arr[i-2][j-1]+arr[i-2][j];//每一行的第k个数等于上一行的第k-1个和第k个数相加
                }
            }
        } 
        System.out.println(arr[n][k]);//输出结果
    }

}

4.结果截图

三.使用递归的方法利用组合数递推的方法计算

1.程序设计思想

根据提示输入n和k的值,创建一个方法,在方法里判断n和k的输入是否符合条件,若n<0或者k<0时,返回0,不成立。当n=k或者k=0时,返回1,当k<n,进行组合数的相加

2.程序设计思想

3.源程序代码

import java.util.Scanner;
public class digui 
{
    public static void main(String[] args)
    {
        System.out.println("请输入组合数C(n,k)的两个变量n和k的值");
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();//输入n和k的值
        int k=input.nextInt();
        System.out.println("结果为:"+C(n,k));
    }
    public static int C(int n,int k)//创建一个方法
    {
        if(k==0||k==n)//当下标=0或者当n和k相等时,C(n,k)结果为1,返回1
        {
            return 1;
        }
        if(k<0||n<0||k>n)//当下标越界或者n或k的值为负,返回0
        {
            return 0;
        }
        else
        {
            return C(n-1,k-1)+C(n-1,k);//当满足k<m,进行组合数的相加
        }
    }
}

4.结果截图

四.汉诺塔问题

1.程序设计思想

将n个盘子从A座移动到C座可以分解为3个步骤:1.将A上n-1个盘借助c座先移到B座上,2.把A座下剩下的一个盘移动到C座上。3.将n-1个盘从B座借助于A移动到C座上。

(1)初始化步数为0,在主函数中输入盘子数

(2)创建两个方法,一个方法名为hannuo,形参个数为4个,在此方法中判断盘子数是否为1,若为1,只需将盘子直接移动到c座上,若不为1,借用递归依次将盘子上的n-1个移走,将最底下的放到c座,另一个方法名为move,形参个数为3个,进行步数++,输出移动过程。

(3)在主函数中调用hannuo方法。

2.程序流程图

3.源程序代码

import java.util.Scanner;
public class hannuo 
{
    static int step=0;//初始化步数为0
    public static void main(String[] args) 
    {
        int num;//定义盘子数
        System.out.println("请输入N个盘子");
        Scanner input=new Scanner(System.in);
        num=input.nextInt();
        hannuo(num,'A','B','C');//调用hannuo方法
    }
    public static void hannuo(int n,char one,char two,char three)
    {
        if(n==1)//考虑盘子数为1的情况
        {
            move(n,one,three);
        }
        else//当盘子数不为1时,
        {
            hannuo(n-1,one,three,two);//调用hannuo方法和move方法
            move(n,one,three);
            hannuo(n-1,two,one,three);
        }
    }
    public static void move(int n,char one,char two)
    {
        step++;//步数++;
        System.out.println("第"+step+"步,盘子"+n+"从"+one+"塔移动"+two+"塔/n");//输出移动的过程
    }

}

4.结果截图

五.使用递归方式判断某个字串是否为回文

1.程序设计思想

定义is方法,在方法内定义a,b,a=str。Length()-n,b=str.length()-(a+1);两者一个从头开始,一个从尾部开始,开始相向而行,两者控制对应位置,下面运用递归算法,一遍一遍对应判断对应位置的值是否一样,当两者一样时,进行一次确定,只有一个字符就是回文数的判断。在主函数调用is方法,用m接受j的值,判断m是否为1,若为1,则为回文数,否则不是。

2.程序流程图

3.源程序代码

import java.util.Scanner;
public class huiwen 
{
    public static void main(String[] args)
    {
        System.out.println("请输入字符串");
        Scanner input=new Scanner(System.in);
        String str=input.next();
        int n=str.length();//测定字符串长度
        int m=is(str,n);//调用is方法,m接受j的值
        if(m==1)
        {
            System.out.println("是回文字符串");
        }
        else
        {
            System.out.println("不是回文字符串");
        }
    }
    public static int is(String str,int n)
    {
        int a,b,j=0;
        char c1,c2;
        a=str.length()-n;//控制进程,从第一个开始正向移动
        b=str.length()-(a+1);//从最后一个开始倒着移动
        c1=str.charAt(a);//取字符的函数,取第一个字符
        c2=str.charAt(b);//取最后一个字符
        if(c1==c2||a==b)//判断当第一个字符和最后一个字符相等时或者判断当字符个数为奇数时
        {
            j=1;//如果条件成立,将j置为1。奇数个字符时,多出来的一个,不用递归判断,直接是回文数
        }
        if(a!=b&&a<b&&j==1)//判断当上一个条件成立时并且字符串还没有比较完,接着调用is方法
        {
            is(str,n-1);//此时n-1
        }
        return j;//返回j
    }
}

4.结果截图

原文地址:https://www.cnblogs.com/lijing925/p/7663828.html