学号 20175212童皓桢 第五周迭代选做题学习
题目要求
1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能
2 m,n 要通过命令行传入
3.正常情况下用JDB调试程序c(X,2),X为学号最后一位+3
代码
import java.util.Scanner;
class ZuHeShu{
int zuheshu (int n,int m){
if(m==1) return n;
else if(m==0) return 1;
else if(m==n) return 1;
else if (n>m&&m>1&&n>1) return zuheshu(n-1,m-1)+zuheshu(n-1,m);
else return -1;
}
}
public class diedai {
public static void main(String[] args) {
Scanner reader = new Scanner (System.in);
System.out.println("输入m:");
int m=reader.nextInt();
System.out.println("输入n:");
int n=reader.nextInt();
ZuHeShu a =new ZuHeShu();
if(a.zuheshu(n,m)==-1)
System.out.println("输入数据有误");
else
System.out.println("C(n,m)="+a.zuheshu(n,m));
}
}
测试运行截图
1.正常情况
2.异常情况
3.边界情况
代码调试
1.使用JDB调试,并将断点设置至main处,如下图:
2.使用step
指令使代码运行至需要输入数据处
发现调试出现错误,并提示找不到源文件。鉴于JDB没有设置条件断点功能,因此换IDEA进行调试
3.根据题目要求,在IDEA中调试,学号尾数为2,故X=5
练习中遇到的问题
-
问题一:未经调试地程序在输入数据运行时,总出现结果为负数地情况
-
解决办法一:经过多次尝试和规律探寻,发现问题地关键在于:由于编程实现组合数是通过迭代算法,组合数在
m=1,m=n,m=0
等这些 基底情况 时需要用if语句单独讨论。 -
问题二:使用JDB进行调试时,step到输入语句时,自动跳出程序并出错
-
解决办法二:使用IDEA进行调试并可以使用条件断点作为帮助。
感悟体会
- 迭代法是一个十分好用并且编写风格简介的算法,但是需要注意具体问题中的特殊的 基底情况 ,类似于数学归纳法中n=1,2时的情况需要重点关注。