2012-03-14 100 views
1

我自己寫了這段代碼,但我是遞歸的新手,我需要一些幫助來改變這段代碼,所以它是遞歸的。我從一個基本案例開始。我試圖編寫檢查兩個字符串的代碼,看看它是否相同。你會如何遞歸編寫這段代碼?

public static boolean check(String s1, String s2) { 
    int count = 0; 
    if (s1.length() != s2.length()) { 
     return false; 
    else { 
     for (int i=0; i< s1.length(); i++){ 
      if(s1.charAt(i) != s2.charAt(i)) 
       return false; 
      count = i; 
     } 
     if(count == s1.length()-1) 
      return true; 
    } 
    return false; 
} 
+0

在現實生活中,您將使用'String#equals(..)' – Nishant 2012-03-14 05:13:25

+0

這種情況不太適合遞歸,迭代方法幾乎總是更好,如果您正在尋找遞歸示例,我會建議尋找簡單的樹搜索示例,例如導航二叉樹 – Istinra 2012-03-14 05:17:51

+0

使用equals()或eqaulsIgnoreCase()java.lang.String的方法 – 2012-03-14 05:19:29

回答

2

變量count是不必要的。您可以用遞歸調用替換for循環:

public static boolean check(String s1, String s2) { 
    if (s1.length() != s2.length()) 
     return false; 
    return check(s1, s2, 0); 
} 

private static boolean check(String s1, String s2, int i) { 
    // this is up to you 
    return check(s1, s2, i+1); 
} 

編輯:剛纔看到的功課標籤

+0

哦,你把它留給了,因爲它是作業。 – 2012-03-14 05:25:54

+0

它是不是有人只是怪胎標記爲 – user1268088 2012-03-14 05:32:09

+1

它絕對*是*作業。你無法解析我的完整答案就證明了這一點。 – 2012-03-14 15:51:59

0

我不希望在Java這裏寫這是算法中,你可以弗洛:

compare(s1, s2, index) 
begin 
if(s1.charAt(index)==s2.charAt(index)) 
    return compare(s1,s2,index+1); 
else 
    return false; 
end 

這個你要添加的邊界條件,現在是,如果指數超過長度

+0

btw遞歸是不是最好的soln在這裏 – Baz1nga 2012-03-14 05:21:16

+0

你的答案評論有風格,我喜歡它。 ;-) – Jasonw 2012-03-14 05:23:47

0

這是檢查properly tail recursive

class strcmp { 

private static boolean inner_check(String s1, String s2, int n) { 
    if (n == s1.length()) 
    return true; 
    if (s1.charAt(n) != s2.charAt(n)) 
    return false; 
    return inner_check(s1, s2, n + 1); 
} 

public static boolean check(String s1, String s2) { 
    if (s1.length() != s2.length()) 
    return false; 
    return inner_check(s1, s2, 0); 
} 

public static void main(String[] args) { 
    if (args.length < 2) { 
    System.out.println("provide two arguments"); 
    return; 
    } 
    System.out.println(check(args[0], args[1])); 
} 
} 
+0

你說什麼時提供2個論據是什麼意思 – user1268088 2012-03-14 05:41:30

0

嘿遞歸是指函數調用本身,如果你使用遞歸調用,你應該關心的遞歸調用不應該去無限的,意味着我們需要把一些檢查點,以避免無限循環的執行。

在你的代碼中,你絕不會在遞歸中檢查(String,String s2)內部的「check(String args1,String args2)」。

我給你簡單的例子遞歸調用

public boolean check(int s1, int s2) { 
    boolean b=s1>s2; 
    if(b) 
    { 
     return b; 
    } 
    else 
    { 
    return check(s1,s2-1); //here 
    } 

} 

您可以檢查調用本身(標記註釋這裏)看到。

0

你在這裏有一些答案,向你展示遞歸代碼。我只是想補充一點,因爲你只是在學習編寫遞歸代碼,所以你需要先了解流程是如何工作的以及如何完成的。 例如:您應該首先編寫不進行遞歸調用以防止無限遞歸的基本情況。 閱讀this,它會給你一個更好的見解。