zoukankan      html  css  js  c++  java
  • 02方法-作业01-递归练习

    一:使用计算机计算组合数

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

    程序设计思想:利用递归的思想来定义方法jc()来及计算n!,并根据组合数公式C(m,n)=n!/m!*(n-m),定义一个变量sum,

    用来输出结果,将n,m,n-m,代入jc(),输出结果。

    程序流程图:

    程序源代码:

    import java.util.Scanner;
    public class Zuheshu{
    public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入两个数:");
    int k =sc.nextInt();
    int n =sc.nextInt();
    int sum =jc(n)/(jc(k)*jc(n-k));
    System.out.println(sum);


    }


    private static int jc(int s) {
    if(s==0||s==1)
    return 1;
    else{
    return s*jc(s-1);
    }
    }
    }

    程序测试截图:

    (2)使用递归的方法用杨辉三角来计算组合数

    程序设计思想:

    定义一个二维数组T存储杨辉三角形,循环赋值构造杨辉三角形:并使T[i][0] = 1,T[i][i] = 1,其中每个T[i][j] =T[i - 1][j - 1] + T[i - 1][j]。所以C(m,n)=T[n][k],

    最后输出结果。

    程序流程图:

    程序源代码:

    import java.util.Scanner;

    public class zuuheshu {

    public static void main(String[] args) {

    System.out.print("请输入组合数中的底数m:");

    Scanner sc = new Scanner(System.in);

    int m = sc.nextInt();

    System.out.print("请输入组合数中的阶数n:");

    int n= sc.nextInt();

    System.out.println("该组合数的结果为:"+T(m,n));

    }

    public static int T(int m,int n){

    int[][] S = new int[m + 1][m + 1];

    S[0][0] = 1;

    for(int i = 0;i < m + 1;i++)

    {

    S[i][0] = 1;

    S[i][i] = 1;

    }

    for(int i = 2;i < m + 1;i++)

    {

    for(int j = 1;j < i;j++)

    {

    S[i][j] = S[i - 1][j - 1] + S[i - 1][j];

    }

    }

    return S[m][n];

    }

    }

    程序测试截图:

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

    程序设计思想:

    定义n,k求组合数函数C(n,k)。当k = 0或n = k时,返回值为1。否则,根据递推公式,C(n,k) = C(n - 1,k - 1) + C(n - 1,k),

    最后输出结果。

    程序流程图:

    程序源代码:

    import java.util.Scanner;

    public class zuuuheshu {

    public static void main(String[] args) {

    System.out.print("请输入组合数中的底数m:");

    Scanner sc = new Scanner(System.in);

    int sc_m = sc.nextInt();

    System.out.print("请输入组合数中的阶数n:");

    int sc_n = sc.nextInt();

    System.out.print("该组合数的结果为:"+jisuan(sc_m,sc_n));

    }

    public static long jisuan(int m,int n)

    {

    if(m == n || n == 0)

    return 1;else

    return jisuan(m - 1,n - 1)+jisuan(m - 1,n);

    }

    }

    程序测试截图:

    二:递归编程解决汉诺塔问题

    程序设计思想:

    当盘子的个数n=1时,直接从A移动到C;n>1时,可将其分为三个步骤:1)将上面n-1个盘子从A座移到B座上。2)将剩下的一个盘子从A座移到C座上。

    (3)将B座上的n-1个盘子从B座移动到C座上。设置变量n为盘子数,根据n的不同输出结果。

    程序流程图:

    程序源代码:

    import java.util.Scanner;
    public class Hanoi {
    public static void main(String args[]){
    System.out.println("请输入要移动的块数:");
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    move(n,'a','b','c');
    }
    public static void move(int n,char a,char b,char c){
    if(n==1){
    System.out.println(a+"-->"+c);
    }
    else{
    move(n-1,a,c,b);
    System.out.println(a+"-->"+c);
    move(n-1,b,a,c);
    }
    }
    }

    程序测试截图:

    三:使用递归判断方式判断某个字符串是否为回文

    程序设计思想:

    首先判断字符串如果小于等于1,则返回为true。若果字符串第一个与最后一个不相等,则输出为false,然后递归调用subString函数每次去掉头和尾,进行

    判断。

    程序流程图:

    程序源代码:

    import java.util.Scanner;
    public class Huiwenshu {
    public static void main(String[] args) {
    Scanner sc =new Scanner(System.in);
    System.out.println("请输入字符串:");
    String skt = sc.nextLine();
    System.out.println("Is it a Palindrome?"+isPalindrome(skt));
    }

    public static boolean isPalindrome(String s){
    if(s.length()<=1){
    return true;
    }else if(s.charAt(0) != s.charAt(s.length()-1)){
    return false;
    }
    return isPalindrome(s.substring(1,s.length()-1));
    }
    }

    程序测试截图:

  • 相关阅读:
    [CF803D] Magazine Ad(二分,贪心)
    [CF803A] Maximal Binary Matrix(构造)
    [CF803B] Distances to Zero(模拟)
    [HDOJ5869] Different GCD Subarray Query(RMQ,树状数组,离线)
    [SPOJ DQUERY] D-query(树状数组,离线)
    [CF193B] Xor(暴力,剪枝,异或)
    [swust 1741] 最长递增子序列问题(DP,最大流)
    [HDOJ3998] Sequence(DP,最大流)
    [swust1745] 餐巾计划问题(费用流)
    [51nod 1208] Stars in Your Window(线段树,扫描线)
  • 原文地址:https://www.cnblogs.com/lwq666/p/7663653.html
Copyright © 2011-2022 走看看