递归调用

左心房为你撑大大i 提交于 2019-12-21 04:11:12

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;
 }
}

  实验截图

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!