问题描述
packagecstring;/****@authorAdministrator*/importjava.io.*;publicclassPrac7{publicstaticvoidmain(String[]args){readDigits();}publicstaticvoidreadDigits(){InputStreamReaderinput=newInputStreamReader(System.in);BufferedReaderkeyboard=newBufferedReader(input);System.out.print("PleaseenteraString:");try{Stringc=keyboard.readLine();booleanflag=false;flag=isAsDigits(c);if(flag!=false)System.out.println("fail");}catch(Exceptione){e.printStackTrace();}}publicstaticbooleanisAsDigits(Stringstr){booleanhasDigit=false;booleanisDigit=false;if(str.length()==0){System.out.println("Thisisanemptystring.");readDigits();}else{intindex=0;StringfirstElement=str.substring(index,index+1);String[]integer={"1","2","3","4","5","6","7","8","9","0"};for(inti=0;i<integer.length;i++){if(firstElement.equals(integer[i]))hasDigit=true;}if(hasDigit==true){isDigit=true;}else{if(str.length()>1){StringnewString=str.substring(index+1,str.length());System.out.print(firstElement);isAsDigits(newString);}elseif(str.length()==1){System.out.print(firstElement);isDigit=false;}}}returnisDigit;}}要求是用递归编写一个读取string类型数据的程序,如果该数据中出现了数字,就报fail我上面编写好的如果开始输入数字没问题run:PleaseenteraString:12fail成功生成(总时间:2秒)但是如果先输入字母再输入数字就不对了run:PleaseenteraString:as12as成功生成(总时间:2秒)
解决方案
解决方案二:
后面递归判断的boolean值回传没有记录
解决方案三:
这么简单一个程序被写成这么复杂?
解决方案四:
看看你的递归函数,是不是每次都有正确的返回值
解决方案五:
如果你不想多改的话if(str.length()>1){StringnewString=str.substring(index+1,str.length());System.out.print(firstElement);isAsDigits(newString);}
改成if(str.length()>1){StringnewString=str.substring(index+1,str.length());System.out.print(firstElement);isDigit=isAsDigits(newString);}
解决方案六:
/****@authorAdministrator*/importjava.io.*;publicclassPrac7{Stringstr;publicstaticvoidmain(String[]args){newPrac7().readDigits();}publicvoidreadDigits(){InputStreamReaderinput=newInputStreamReader(System.in);BufferedReaderkeyboard=newBufferedReader(input);System.out.print("PleaseenteraString:");try{Stringc=keyboard.readLine();booleanflag=false;flag=isAsDigits(c);if(flag!=false)System.out.println("fail");elseSystem.out.println(str);}catch(Exceptione){e.printStackTrace();}}publicbooleanisAsDigits(Stringstr){this.str=str;for(inti=0;i<str.length();i++){if((int)str.charAt(i)>=48&&(int)str.charAt(i)<=57){returntrue;}}returnfalse;}}
其实这样就可以了。正则表达式的话更快
解决方案七:
引用楼主llwforever91的回复:
Stringc=keyboard.readLine();booleanflag=false;flag=isAsDigits(c);if(flag!=false)System.out.println("fail");}
输入12后,flag的值为true;而输入as12后,flag的值为false,所以会出现那个结果。只要把if(flag!=false)改为if(flag==false)应该就没问题了!
解决方案八:
引用4楼bxftyt的回复:
如果你不想多改的话Javacodeif(str.length()>1){StringnewString=str.substring(index+1,str.length());System.out.print(firstElement);isAsDigits(newString);}改成……
这道递归题小猫咪提供的这种方法是可以的,也是很标准的传回递归值的方法,另外的话还可以将booleanhasDigit=false;booleanisDigit=false;这两个方法中的变量提到方法外,成为全局变量:staticbooleanhasDigit=false;staticbooleanisDigit=false;这样也是可以的