Java递归函数问题_java作业利用递归解决问题

第一题

利用递归求组合数

设计思想

(1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算

(2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数,并且每次判断,行列和用户想要得到数的行列是否相同

(3)递归方法,递归调用函数,通过地递推公式从后往前推导  求C[n,k]=C[n-1,k-1]+C[n-1,k],根据这个公式直到n=1或者k=0;或者n=k相等时结束

程序流程图

fe1a166a6923e27325ccc166adb5d285.png

6eaf0ee552ff3d51b77aa3dd83d89681.png

a0f8f86a47cbdd5f528f6f6eabaa5328.png

程序源代码

import java.util.Scanner;

public class Yanghui {

public int Jiecheng(int i){ //递归阶乘

if(i==1||i==0)

{

return 1;

}

return i*Jiecheng(i-1);

}

public int Ditui(int i,int j)

{

int a[][]=new int[100][100]; //声明二维数组用来储存杨辉三角

a[0][0]=1;

int result=1; //用来保存结果

for(int p=1;p<100;p++)

for(int q=0;q<=p;q++)

{

if(q==0||p==q) //杨辉三角的两腰上的数为1

{

a[p][q]=1;

}

else

a[p][q]=a[p-1][q-1]+a[p-1][q]; //递推求结果

if(p==i&&q==j) //判断是不是要输出的结果

{

result=a[p][q];

break;

}

}

return result;

}

public int Zuhe(int i,int j)//组合数公式的下标

{

if(i==0||j<=1||i==j)

{

return 1;

}

return Zuhe(i-1,j-1)+Zuhe(i-1,j);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Yanghui yh=new Yanghui();

System.out.println("请输入组合数下标和行标(用空格或者回车区分)");

Scanner input=new Scanner(System.in);

int hang=input.nextInt(); //组合数的下标

int lie=input.nextInt(); //组合数上标

int fenzi,fenmu;

fenzi=yh.Jiecheng(hang); //使用阶乘方式计算结果的分子

fenmu=yh.Jiecheng(lie)*yh.Jiecheng(hang-lie); //计算分母

System.out.println("利用阶乘计算结果:"+fenzi/fenmu+" "); //输出结果

System.out.println("利用递推方式计算结果:"+yh.Ditui(hang, lie)+" ");

System.out.println("利用递归方式计算结果:"+yh.Zuhe(hang+1, lie+1)+" ");

}

}

测试结果截图

46b99477734703326a87c8e10039f22d.png

第二题

汉诺塔问题

设计思想

题目要求将n个盘子借助2号杆从1号到3号,首先想假如是两个盘子,就是把第一个放到2.第二个放到三,再将二号放到三号。假如是三个就将上边两个借助三号放到二号,再将最后一个放到三号,在把二号的借助一号放到三号。依次类推。利用递归实现。就是从n个盘子开始,将n-1个移到二号,在将最后一个移到三,将二号上的借助一号移到三。那么n-1个移到二号也是如此,知道只剩一个盘子,算法结束。

程序流程图

adf03e06c24c857d47e247d203dfe314.png

程序源代码

import java.util.Scanner;

public class Hannt {

public void Hnt(int a,char one,char two,char three){ //将one上的借助two移到三

if(a==1)

move(one,three);

else

{

Hnt(a-1,one,three,two); //从one借助three移动到two

move(one,three);

Hnt(a-1,two,one,three);

}

}

public void move(char x,char y){

System.out.println(x+"->"+y); //从x移到y

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Hannt h=new Hannt();

Scanner input=new Scanner(System.in);

System.out.print("请输入初始盘子数量:");

int num=input.nextInt();

h.Hnt(num,'1','2','3');

}

}

测试结果截图

4a0809503a1a676c5bac8e4c00c3c963.png

第三题

检查字符串是否为回文数

设计思想

统计字符串长度,然后定义两个数,一个保存初始位置,第二保存末尾位置,通过字符串中提取函数,提取相对位置字符,并匹配是否相同,每次执行后长度都减二,直到长度为零或一,并输出结果。

程序流程图

cff904e76e36b3e0e09f9eab8cbbad50.png

程序源代码

import java.util.Scanner;

public class Huiwen {

public int Hw(String str,int length,int star,int stop){

if(length==0||length==1)

{

return 1;

}

if(str.charAt(star)!=str.charAt(stop))

{

return 0;

}

else

{

return Hw(str,length-2,star+1,stop-1);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner input=new Scanner(System.in);

String s=input.nextLine();

Huiwen hw=new Huiwen();

int l=s.length();

if(hw.Hw(s, l, 0, l-1)==1)

{

System.out.println("是回文字符串");

}

else

System.out.println("不是回文字符串");

}

}

测试结果截图

17847c13dd6ab2fd1a4e66460ee5e03a.png

34f59ee3e041543877c15d01d0026a26.png

总结

这三个题都是根据递归完成的,在过程中遇到的错误大都是递归无法跳出,结束条件不完整导致直接报错。所以在下次应该仔细检查结束条件,这是最重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值