【问题标题】:How would you write this code recursively?您将如何递归编写此代码?
【发布时间】:2012-03-14 05:10:32
【问题描述】:

我自己编写了这段代码,但我是递归的新手,我需要一些帮助来更改这段代码,以便它是递归的。我从一个基本案例开始。我正在尝试编写检查两个字符串并查看其是否相同的代码。

    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;
}

【问题讨论】:

  • 在现实生活中你会使用String#equals(..)
  • 这种情况不太适合递归,迭代方法几乎总是更好,如果您正在寻找递归示例,我建议您寻找简单的树搜索示例,例如导航二叉树
  • 使用 java.lang.String 的 equals() 或 eqaulsIgnoreCase() 方法

标签: java


【解决方案1】:

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);
}

编辑:刚刚看到作业标签

【讨论】:

  • 这不是有人刚刚把它标记为
  • 这绝对是的家庭作业。您无法解析我的完整答案就证明了这一点。
【解决方案2】:

我不想在 java 中写这个是你可以遵循的算法:

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

现在你必须添加边界条件,即检查索引是否超过长度

【讨论】:

  • btw 递归在这里不是最好的解决方案
  • 你回答的评论很有风格,我喜欢。 ;-)
【解决方案3】:

这是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]));
}
}

【讨论】:

  • 你说提供 2 个论点是什么意思
【解决方案4】:

您在这里有一些答案,这些答案向您展示了递归代码。我只是想补充一下,由于您只是学习编写递归代码,因此您需要首先了解该过程是如何工作的以及应该如何完成。 示例:您应该首先编写不进行递归调用的基本情况,以防止无限递归。 阅读this,它会让你有更好的洞察力。

【讨论】:

    【解决方案5】:

    嘿,递归意味着函数调用本身,如果你使用递归调用,你应该注意递归调用永远不会无限,这意味着我们需要设置一些检查点以避免无限循环执行。

    在您的代码中,您永远不会在 check(Strings,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
       }
    
    } 
    

    您可以在检查调用中看到(在此处标记为评论)。

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 2016-09-22
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多