2012-03-14 97 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,它会给你一个更好的见解。