2014-01-29 54 views
0

我想使用遞歸將String輸入轉換爲int。這是我想出的代碼,但如果我的輸入是123456,它只返回124.如果我輸入1234567,它會給出錯誤。如何使用遞歸將字符串轉換爲int

import java.util.*; 
public class Problem1 { 
static int x =0; 
static int counter = 0; 
//input 
public static void main(String[] args) { 
Scanner scan = new Scanner (System.in); 
String s= scan.nextLine(); 
System.out.println(recursive(s)); 

} 
//recursive method 
public static int recursive(String s){ 
    if(s.length()==1){ 
     x=(x*10)+ Integer.parseInt(s.substring(0,1)); 
     return x; 
    } 
    else{ 
     x = (x*10)+Integer.parseInt(s.substring(0,1)); 
     counter++; 
     return recursive(s.substring(counter,s.length()-1)); 


    } 

    } 
} 
+1

您的o/p期望值是多少?爲什麼你乘以10? – user1428716

回答

1
import java.util.Scanner; 

public class Problem1 { 
    static int x = 0; 
    static int counter = 0; 

    // input 
    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     String s = scan.nextLine(); 
     System.out.println(recursive(s)); 

    } 

    // recursive method 
    public static int recursive(String s) { 
     if (s.length() == 1) { 
      x = (x * 10) + Integer.parseInt(s.substring(0, 1)); 
      return x; 
     } else { 
      x = (x * 10) + Integer.parseInt(s.substring(0, 1)); 
      counter++; 
      return recursive(s.substring(1, s.length())); 

     } 

    } 
} 
0

看看你的靜態counter變量。你每次都增加它。但是你只想要從1開始的子字符串(所以切斷第一個「字母」)。

因此,而不是使用:

counter++; 
return recursive(s.substring(counter,s.length()-1)); 

考慮使用:

return recursive(s.substring(1)); // you even don't really need the length 

因爲String s參數如下:

1st call: 1234567 
2nd call: 234567 
3rd call: 34567 
4th call: 4567 
... 

所以,你只需要切斷第一封信。

順便說一句:您的樣本「項目」是一個非常有趣的一個;)

0

的幾個注意事項開始:

  1. 如果你正在做遞歸,你可能不希望使用成員變量。這樣做沒有錯,但不是典型的模式(你的x變量)。
  2. 雖然你不必(也就是x的當前值),但通過遞歸傳遞狀態通常很方便。
  3. 您的情況有點奇怪,因爲您必須爲每個子分析更改當前的分析值(每次移動10);使它更復雜一點。
  4. 如果您要將x保留爲成員變量(在這種情況下似乎確實有意義),則不需要從遞歸中返回任何內容。
  5. 你真的不能只使用Integer.parseInt()嗎?

代碼可能會更加簡單,像:

void recursive (String s) 
{ 
    if (s.length() == 0) return 0; 
    x = x * 10 + Integer.parseInt(s.substring(0, 1)); 
    recursive(s.substring(1)); 
} 
0
recursion("1234567", 0, 1) 

上面的代碼將使用遞歸把字符串 「1234567」 成一個int。你必須通過你要轉換的字符串,然後0和1

​​
0
public static int computeStr(String str) { 
     if (str.equals("")) { 
      return 0; 
     } 

     int x = 1; 
     for (int i = 0; i < str.length() - 1; i++) { 
      x = x * 10; 
     } 
     x = x * Integer.parseInt(str.substring(0, 1)); 
     return x + computeStr(str.substring(1)); 
    } 

例如: 「2432」 是(2 * 1000)+(4 * 100)+(3 * 10) +(2×1)= 2432 這種算法從2432開始於第一位置(2)

-1

試試這樣說:

public static int conStrToInt(String str) { 


    if(str.length()==0) 
    { 
     return 0; 
    } 
    char cc = str.charAt(0); 
    String ros = str.substring(1); 

    int factor=1; 
    for(int i=0;i<str.length()-1;i++) 
     factor*=10; 

    factor=factor*(cc-'0'); 
    return factor+conStrToInt(ros); 

} 
0

我知道它怎樣的一個反應遲緩的,但你可以嘗試像這個: -

private static int stringToInt(String string) { 
    if (string.length() == 0) { 
     return 0; 
    } 
    int rv; 
    int num = string.charAt(string.length() - 1) - '0'; 
    String restOfTheString = string.substring(0, string.length() - 1); 
    rv = stringToInt(restOfTheString) * 10 + num; 
    return rv; 
}