java递归使用过程中的一点学习心得

来源:互联网 发布:九域神皇免费阅读 软件 编辑:程序博客网 时间:2024/06/03 08:11
小白程序员在写学生信息管理模块作业的时候用递归实现检验数据错误时重新调用本方法。写完测试代码的时候发现了一个问题。



主方法调用该静态方法执行删除操作
public static void deleteInfo(){   //递归记位器boolean flag = true;    //用于标志是否查到要删除的idScanner sc = new Scanner(System.in);System.out.println("请输入正确的学号");String id = sc.next();//1.看该学号是否存在for(int i=0;i<studentNumbers;i++){if(students[i]!=null){if(students[i].getId().equals(id)){flag=false;break;       //查到了就结束该方法}}}if(flag){System.out.println("不存在该学号\n---------");if(students[0]==null){function();}else{deleteInfo();}}//2.删除并补位for(int i=0;i<studentNumbers;i++){if(students[i]!=null){if(students[i].getId().equals(id)){students[i]=null; //让该位置引用为空,JVM自动回收内存信息//判断是否为最后一个位置if((i+1)!=studentNumbers){for(int j=0;j<(studentNumbers-(i+1));j++){ //删除位置后面的元素往前补students[i]=students[i+(j+1)];  //(J+1)表示i后面第几位students[i+(j+1)]=null;}}}}}System.out.println("\n---删除成功---");}

控制台的信息:



这里可以看到删除的语句打印了三次,这也就意味着,删除学生成绩的逻辑操作执行了3次。但是想要的只是让程序进行一次的删除操作。

学习了递归的相关知识后,发现原来递归方法,方法收敛后会从收敛处继续执行完代码后再返回上一层继续相同的操作。

解决方案:
我把deleteInfo()加上了一个int形参变为deleteInfo(int i)来标志递归方法调用目前处于哪一层。
这样就解决了递归过程中对同个数据的反复处理操作。


修改后的代码:

@param flag_index = 递归标志 
public static void deleteInfo(int flag_index){   boolean flag = true;    //用于标志是否查到要删除的idScanner sc = new Scanner(System.in);System.out.println("请输入正确的学号");String id = sc.next();//1.看该学号是否存在for(int i=0;i<studentNumbers;i++){if(students[i]!=null){if(students[i].getId().equals(id)){flag=false;break;       //查到了就结束该方法}}}if(flag){System.out.println("不存在该学号\n---------");if(students[0]==null){function();}else{flag_index++;         deleteInfo(flag_index);}}//递归方法在该位置终止继续进行程序if(flag_index>1){      //第一个方法该值为1return;}//2.删除并补位for(int i=0;i<studentNumbers;i++){if(students[i]!=null){if(students[i].getId().equals(id)){students[i]=null; //让该位置引用为空,JVM自动回收内存信息//判断是否为最后一个位置if((i+1)!=studentNumbers){for(int j=0;j<(studentNumbers-(i+1));j++){ //删除位置后面的元素往前补students[i]=students[i+(j+1)];  //(J+1)表示i后面第几位students[i+(j+1)]=null;}}}}}System.out.println("\n---删除成功---");}





原创粉丝点击