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;
}
}
实验截图


来源:https://www.cnblogs.com/z245894546/p/7660107.html