Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编码Bat递归练习(java)_Java_String_Recursion - Fatal编程技术网

编码Bat递归练习(java)

编码Bat递归练习(java),java,string,recursion,Java,String,Recursion,我怎样才能递归地解决这个问题,而不是使用replace方法?我正试图得到一个更好的递归方法 给定一个字符串,递归(无循环)计算一个新字符串,其中所有小写“x”字符都已更改为“y”字符 changeXY("codex") → "codey" changeXY("xxhixx") → "yyhiyy" changeXY("xhixhix") → "yhiyhiy" 我作弊并用这种方式解决了它,并试图查看Java字符串方法replace的源代码,但我不理解它。这是我的方法 public String

我怎样才能递归地解决这个问题,而不是使用replace方法?我正试图得到一个更好的递归方法

给定一个字符串,递归(无循环)计算一个新字符串,其中所有小写“x”字符都已更改为“y”字符

changeXY("codex") → "codey"
changeXY("xxhixx") → "yyhiyy"
changeXY("xhixhix") → "yhiyhiy"
我作弊并用这种方式解决了它,并试图查看Java字符串方法replace的源代码,但我不理解它。这是我的方法

public String changeXY(String str) {
  int len = str.length();
  int i = 0;
  String changedStr = str.replace("x","y");


  if (len == 0)
    return str;

  return changedStr;

}
有没有关于如何用递归的方法来做的想法

这里有一个额外的练习,我也不知道怎么做。谢谢你的帮助

给定一个字符串,递归计算一个新字符串,其中所有“x”字符都已删除

noX("xaxb") → "ab"
noX("abc") → "abc"
noX("xx") → ""

递归几乎总是由两部分组成:

停止递归的条件

假设我们可以解决一个较小的问题,即如何使用该假设解决当前问题

public String changeXY(String str) {

  // when to stop
  if (str.length() == 0){
    return str;
  }

  // handle the "special case" using an assumption we can solve str.substring(1)
  if (str.charAt(0) == 'x'){
    return 'y' + changeXY(str.substring(1));
  }
  // handle the "simple" case using an assumption we can solve str.substring(1)
  return str.charAt(0) + changeXY(str.substring(1));
}
一旦你意识到这是如何工作的,其他练习就很容易了。

伪代码:

  changeXY(input) {
    if (input.isEmpty()) return "";
    head = "firstChar"(input);
    tail = "theRest"(input);
    return (head == 'x' ? 'y' : head) + changeXY(tail);
  }


  noX(input) {
    if (input.isEmpty()) return "";
    head = "firstChar"(input);
    tail = "theRest"(input);
    return (head == 'x' ? '' : head) + noX(tail);
  }
您所要做的就是实现或调用适当的Java API,而不是“firstChar”和“theRest”。我相信这将是小菜一碟;)

第一个练习:

public String changeXY(String str) {
      int len = str.length();
      String changedStr = "";
      for(int i=0; i<len; i++){
          if(str.charAt(i) == 'x'){
              changedStr+="y";
          }else{
              changedStr+=str.charAt(i);
          }
      }

      if (len == 0)
        return str;

      return changedStr;

}
publicstringchangerxy(stringstr){
int len=str.length();
字符串changedStr=“”;

对于(int i=0;i递归基于两件事: 1-基本情况:根据特定条件停止方法调用自身 2-操作:此方法要执行的操作+再次调用该方法并更改其参数以达到基本情况。 在这种情况下,您必须执行以下操作

public String changeXY(String string){

    string = string.toLowerCase();
    if(string.length()==0)
    { 
        return string;
    }
    else if (str.charAt(0) == 'x')
    {
        return 'y' + changeXY(str.substring(1));
    }

    return str.charAt(0) + changeXY(str.substring(1)); 
}

希望我的回答能解释一切:)

python代码
仅当给定字符串中有“x”时才进入递归。 执行递归调用,直到所有“x”都更改为“y”

public String changeXY(String str) {
  if(str.contains("x")){
    int idx = str.indexOf("x");
    return changeXY(str.substring(0,idx) + "y" + str.substring(idx+1, str.length()));
  }
  else return str;
}
第一个练习

public String changeXY(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return 'y' + changeXY(str.substring(1, str.length()));
  return str.charAt(0) + changeXY(str.substring(1, str.length()));
}
public String noX(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return "" + noX(str.substring(1));
  return str.charAt(0) + noX(str.substring(1)); 
}
第二个练习

public String changeXY(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return 'y' + changeXY(str.substring(1, str.length()));
  return str.charAt(0) + changeXY(str.substring(1, str.length()));
}
public String noX(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return "" + noX(str.substring(1));
  return str.charAt(0) + noX(str.substring(1)); 
}

除了非递归解决方案之外,您还尝试过什么吗?我不太确定,但是如果(str.contains(“x”){String result=changeXY(str.substring(1,str.length())},您就不能执行
if(str.contains(“x”){String result=changeXY(str.substring(1,str.length())}
?changeXY只是查看第一个字符来更改它?@jrubins不,我还没有谢谢你!!我同意一旦你理解了这个概念,其他类似的字符串递归方法就很容易了。我通常在Eclipse上通过调试器来更好地理解。再次感谢你的时间。我会在几分钟后给你检查谢谢。我明白了ps但我根本没有练习过递归,所以我尝试在没有它们的情况下解决这个练习。这不是递归,因此没有回答“如何递归地解决这个问题…”的问题。此外,它提供了不准确的信息;这不是“for循环中的递归”,正如你所说的那样。我不是想表现得粗鲁或其他什么,但这个答案包含谬误和不准确的地方。@CodyS对不起,让我想到这里的是递归的概念:
递归是以自相似的方式重复项目的过程。
。我总是错过“自我”部分。我会修复细节,但保留我的答案,除非thor想让我删除它。再次感谢你的评论!no sweat@g.carvalho97你只是想帮忙。如果没有更多的索引,changeXY(str.substring(1))为什么不会给出边界外错误?这个问题与Java有关,而不是Python。