[英]Can I return to main from recursion without unwinding the stack?
我寫了一個遞歸方法來減少字符串的長度。 如果他的字符串長度小於20,我想在掃描儀輸入中嘗試下一個字符串。 有沒有一種方法比我編碼的方法更有效?
public static void main(String [] args){
try {
input = new Scanner(new FileInputStream("VectorKnots.txt"));
output = new PrintWriter(new FileOutputStream("ReduceKnots.txt"));
}catch (FileNotFoundException e){
System.out.println("there is a problem with the file");
System.exit(0);
}
while (input.hasNext()){
loop2 = input.nextLine();
loop1.delete(0, loop1.length());
loop1.append(loop2);
Triangle(loop1);
}
}
public static void Triangle(StringBuilder loop1){
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("27")){
trIndex = loop1.indexOf("27");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 4);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("72")){
trIndex = loop1.indexOf("72");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 4);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("63")){
trIndex = loop1.indexOf("63");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 5);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("63")){
trIndex = loop1.indexOf("63");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 5);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("46")){
trIndex = loop1.indexOf("46");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 2);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("64")){
trIndex = loop1.indexOf("64");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 2);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("57")){
trIndex = loop1.indexOf("57");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 3);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("75")){
trIndex = loop1.indexOf("75");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 3);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("52")){
trIndex = loop1.indexOf("52");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 6);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("25")){
trIndex = loop1.indexOf("25");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 6);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("34")){
trIndex = loop1.indexOf("34");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 7);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("43")){
trIndex = loop1.indexOf("43");
loop1.delete(trIndex, trIndex+1);
loop1.insert(trIndex, 7);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("1") && loop1.indexOf("1") + 2) == 0){
trIndex = loop1.indexOf("1");
loop1.delete(trIndex);
loop1.delete(trIndex + 1);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.toString().contains("0") && loop1.indexOf("1") + 2) == 1){
trIndex = loop1.indexOf("0");
loop1.delete(trIndex);
loop1.delete(trIndex + 1);
Triangle(loop1);
}
if (loop1.length() < 20){
return;
}
if (loop1.length() > 19){
out.println(loop1);
}
}
}
如果您使用迭代,則無需從深度嵌套的遞歸中返回。 嘗試:
public static void triangle(StringBuilder loop1) {
for (;;) {
if (loop1.length() < 20)
return;
int trIndex = loop1.indexOf("27");
if ( trIndex >= 0 ) {
loop1.delete(trIndex+1);
loop1.setCharAt(trIndex,'2');
continue; // start over using loop instead of recursion
}
trIndex = loop1.indexOf("72");
if ( trIndex >= 0 ) {
loop1.delete(trIndex+1);
loop1.setCharAt(trIndex,'7');
continue; // start over using loop instead of recursion
}
// more cases
break;
}
}
另請注意
if ( ... > 19 ) out.println(loop1)
不會做任何事情,因為您if ( ... < 20 ) return;
了if ( ... < 20 ) return;
就在之前 可能希望將打印行移至main ()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.