• 递归练习(课程作业)


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

    1.程序设计思想:

    a)使用组合数公式利用阶乘计算:

      定义一个求阶乘的方法fac(int n),fac为递归定义,当 n 不小于1时,返回n*(n - 1)!即n * fac(n - 1),否则返回1。程序接收数据n,k后直接利用组合数公式调用fac方法进行计算:输出fac(n) / (fac(k) * fac(n - k))。

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

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

    c)使用杨辉三角形求组合数:

      定义一个二维数组Y存储杨辉三角形,循环赋值构造杨辉三角形:Y[i][0] = 1,Y[i][i] = 1,(i = 0,1,2……n),其余每个Y[i][j] = Y[i - 1][j - 1] + Y[i - 1][j]。则C(n,k)就等于Y[n][k]。

    2.程序流程图:

     

          

    3.程序源代码:

     1 //使用组合数公式利用n!计算C(n,k)
     2 import java.util.*;
     3 public class Combination {
     4     public static void main(String[] args) {
     5         Scanner in = new Scanner(System.in);
     6         int n,k;
     7         n = in.nextInt();
     8         k = in.nextInt();
     9         
    10         System.out.println(C(n,k));
    11     }
    12     public static int fac(int n){
    13         if(n <= 1)
    14             return 1;
    15         return n * fac(n - 1);
    16     }
    17     public static int C(int n,int k){
    18         return fac(n) / (fac(k) * fac(n - k));
    19     }
    20 }
     1 //使用递归的方法用组合数递推公式计算
     2 public class Recursive {
     3     public static void main(String[] args) {
     4         Scanner in = new Scanner(System.in);
     5         int n,k;
     6         n = in.nextInt();
     7         k = in.nextInt();
     8         
     9         System.out.println(C(n,k));
    10         in.close();
    11     }
    12     public static int C(int n,int k){
    13         if(k == 0 || n == k)
    14             return 1;
    15         return C(n - 1,k - 1) + C(n - 1,k);
    16     }
    17 }
     1 //使用递推的方法用杨辉三角形计算
     2 public class Yanghui {
     3     public static void main(String[] args) {
     4         Scanner in = new Scanner(System.in);
     5         int n,k;
     6         n = in.nextInt();
     7         k = in.nextInt();
     8         
     9         System.out.println(C(n,k));
    10         in.close();
    11     }
    12     public static int C(int n,int k){
    13         int[][] Y = new int[n + 1][n + 1];
    14         Y[0][0] = 1;
    15         for(int i = 0;i < n + 1;i++)
    16         {
    17             Y[i][0] = 1;
    18             Y[i][i] = 1;
    19         }
    20         for(int i = 2;i < n + 1;i++)
    21             for(int j = 1;j < i;j++)
    22                 Y[i][j] = Y[i - 1][j - 1] + Y[i - 1][j];
    23         return Y[n][k];
    24     }
    25 }

    4.执行结果:

     

    二、汉诺塔问题:

    1.程序设计思想:

      要将A位置上N个圆盘移动到C位置上,如果N = 1则直接移动,如果N > 1,则须

        1)将A位置上N - 1个圆盘借助C移动到B位置

        2)将A位置上剩下的一个圆盘移动到C位置

        3)将B位置上N - 1个圆盘借助A移动到C位置

      其中1)、3)可使用递归完成:

        定义函数move(int n,char A,char B,char C)为:将A上n个圆盘借助B移动到C上(B、C为空),

        则“1)”即递归调用move(n - 1,A,C,B)

         “2)”即递归调用move(n - 1,B,A,C)

    2.程序流程图:

    3.程序源代码:

     1 import java.util.*;
     2 public class Hanoi {
     3     public static void main(String[] args) {
     4         System.out.println("A位置上圆盘数量:");
     5         Scanner in = new Scanner(System.in);
     6         Hanoi(in.nextInt(),'A','B','C');
     7     }
     8     public static void Hanoi(int n,char a,char b,char c){
     9         if(n == 1)
    10             System.out.println(a + "->" + c);
    11         else{
    12             Hanoi(n - 1,a,c,b);
    13             System.out.println(a + "->" + c);
    14             Hanoi(n - 1,b,a,c);
    15         }
    16     }
    17 }

    4.执行结果:

    三、判断回文字符串

    1.程序设计思想:

    2.程序流程图:

    3.程序源代码:

     1 import java.util.Scanner;
     2 
     3 public class Palindrome {
     4     public static void main(String[] args) {
     5         Scanner in = new Scanner(System.in);
     6         String str = in.next();
     7         System.out.println(isPalin(str));
     8     }
     9     
    10     public static boolean isPalin(String str){
    11         if(str.equals("") || str.length() == 1)
    12             return true;
    13         if(str.charAt(0) == str.charAt(str.length() - 1))
    14             return isPalin(str.substring(1, str.length() - 1));
    15         else return false;
    16     }
    17 }

    4.执行结果:

  • 相关阅读:
    Linux任务前后台的切换
    如何给html元素的onclick事件传递参数即如何获取html标签的data
    关键词多空格处理
    tp3常量
    php 正则判断是否是手机号码
    thinkphp 初始化
    删除图标
    time() 在thinkphp 3.2.3 模板格式化输出
    iOS工程如何支持64-bit
    调试instruments
  • 原文地址:https://www.cnblogs.com/lzq666/p/7657042.html
Copyright © 2020-2023  润新知