• 递归调用


    1.组合式公式

    设计思想

    实验要求输入两个数求组合数,首先要输这两个数才能进行程序,输入后,根据组合数公式中全是阶乘,使用递归比较方便,n!=n*(n-1)*......1,递归中返回n*zuheshu(n-1),实现阶乘,最后调用阶乘函数,输出就完成程序。

    程序流程图

     

    实验源代码

    import java.util.Scanner;
    public class Sz {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	Scanner input=new Scanner(System.in);
    	int a;
    	int b;
    	int c;
    	//定义所需的三个变量
    	System.out.println("输入组合数公式所需的数:");
    	a=input.nextInt();
    	b=input.nextInt();
    	//对要计算的两个变量进行赋值。
    	while(a==0||a<=b)
    	{
    		System.out.println("无法计算,重新输入");
    	
    	}
    	//判断底下的除数是否可除
    c=zuheshu(a)/(zuheshu(b)*zuheshu(a-b));//用递归函数对a,b进行赋值计算后传给c。
    System.out.println("组合数为"+c);//输出组合数。
    	}
    	//创建递归函数,设置形参,还有int类型,用来返回int型的c。
    	public static int zuheshu(int n)
    			{
    		if(n==1||n==0)
    		{
    			return 1;
    		}
    		else 
    			return n*zuheshu(n-1);//递归,自己引用自己进行计算。
    			}
    
    }
    

      实验截图

    2.杨辉三角算组合数

    设计思想

    与前面的思想大致相同,但所需要递归调用的数学式子不同。值得注意的是调用函数的返回值要与定义的赋值元素相同,否则无法执行。

    程序源代码

    import java.util.Scanner;
    public class Sz2 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		 Scanner input=new Scanner(System.in);
    		 int a;
    		 int b;
    		 System.out.println("输入杨辉三角的两个数:");
    		 a=input.nextInt();
    		 b=input.nextInt();
    		 System.out.println(yhsjdg(a+1,b)-yhsjdg(a,b-1));
    		    
    	}
    	 public static long yhsj(int n) {
    	        if(n==1 || n==0){
    	            return 1;
    	        }
    	        return n*yhsj(n-1);
    	    }
    	    
    	public static long yhsjdg(int i,int j) {
    	    long c= yhsj(i)/yhsj(j)/yhsj(i-j);
    	    return c;
    	}
        }
    

      实验截图

    3.递推方法算组合数

    实验思想

    前两个都是递归求阶乘后再次算出组合数,递推直接求,直接返回 (zuheshu(n-1,k-1)+zuheshu(n-1,k));

    程序源代码

    import java.util.Scanner;
    public class Sz1 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner input=new Scanner(System.in);
    		int a;
    		int b;
    		int c;
    		//定义所需的三个变量
    		System.out.println("输入组合数公式所需的数:");
    		a=input.nextInt();
    		b=input.nextInt();
    		System.out.println("组合数为:"+zuheshu(a,b));
    	}
    public static int zuheshu(int n,int k)
    {
    	if(k==0)
    	{
    		return 1;
    	}
    	else if(n==k)
    	{
    		return 1;
    	}
    	else 
    		return (zuheshu(n-1,k-1)+zuheshu(n-1,k));
    	}
    }
    

      实验截图

    实验中出现的问题

    1.对于递归调用这种函数要想很久才能绕过弯来。

    2.在判断a,b为0或1时,返回值return应为1,一直返回0导致程序无法执行找不到错误。

    3.杨辉三角的不熟悉导致第二个没有思路可以下手。

    4.汉诺塔问题

    设计思路

    先假设最简单的有3个盘子,要把上面两个放到中间B的位置,再把最底下的放到C位置,要把两个放到B上面又要把第一个放到C上,第二个放到B上,再把第一个放到B上,最后就是把B上第一个的放到A,第二个放到C,再把A上的放到C,就完成了。这就是一种递归,假设有n个盘子,先把(n-1)放到B坐,把最下面的放到C,(n-1)中又把(n-2)放到B,再拿出最底下的(n-1),一直重复最后放完。

    程序流程图

     

    程序源代码

       import java.util.Scanner;
    public class Hannuota {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner input=new Scanner(System.in);
    		int m;
    		System.out.println("放入的盘子数:");
    		m=input.nextInt();
    		System.out.println("移动的步骤:");
    		buzhou(m,'A','B','C');
    	}
    	public static void buzhou(int n,char one,char two,char three)
    	{
    		
    			if(n==1)
    				move(one,three);
    			else{
    				buzhou(n-1,one,three,two);
    				move(one,three);
    				buzhou(n-1,two,one,three);
    			}
    		}
    		public static void move(char x,char y)
    		{
    			System.out.println(x+"——>"+y);
    		}
    	}
    

      实验截图

    实验问题

    1.由于要递归两次,所以导致该开始没有实现。

    2.温馨提示就是c语言书中有操作步骤,可以作为参考。

     5.回文数

    实验思想

    回文数就是说正着读,反着读都一样,也就是说如果只有一个字符,一定回文,两个一样的,一定回文,三个以上的话,最左边和最右边相同然后依次向里夹都相同就回文。“往里夹”就是要用递归的基本方式。这是这个程序的核心,整体的思路就是输入字符串,然后进行调用回文的递归函数,判断后,输出。

    实验流程图

    程序源代码

    import java.util.Scanner;
    public class Hw {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner input=new Scanner(System.in);
    		String s;
    		System.out.println("输入要判断的字符:");
    		s=input.next();
    		System.out.println(huiwenshu(s));
    	}
     public static boolean huiwenshu(String s)
     {
    	  int length = s.length();
    	  for(int i=0;i<length/2;i++){
    	   if(s.charAt(i)!=s.charAt(length-i-1)){
    	    return false;
    	   }
    	  }
    	  return true;
     }
    }
    

      实验截图

  • 相关阅读:
    亚马逊EMR学习网站
    python实现redis三种cas事务操作
    【转】Jython简单入门
    【转】Android 收集已发布程序的崩溃信息
    【转】Android 避免APP启动闪黑屏(Theme和Style)
    【转】Android内存机制分析2——分析APP内存使用情况
    【转】Android内存机制分析1——了解Android堆和栈
    【转】JAVA Socket用法详解
    【转】JAVA 网络编程
    Android 无法Bind Service
  • 原文地址:https://www.cnblogs.com/z245894546/p/7660107.html
Copyright © 2020-2023  润新知