Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
将字符串分成三部分,并将递归应用于flip:java_Java - Fatal编程技术网

将字符串分成三部分,并将递归应用于flip:java

将字符串分成三部分,并将递归应用于flip:java,java,Java,我试图将字符串分成三个部分,并将每个部分向后打印。因此,当用户输入“HelloWorld”时,它应该打印“dlroWolleH”。我不知道我错在哪里,它像一对翻转 import java.util.*; public class recursion { public static void main(String args[]) { Scanner scanner = new Scanner (System.in); System.out.prin

我试图将字符串分成三个部分,并将每个部分向后打印。因此,当用户输入“HelloWorld”时,它应该打印“dlroWolleH”。我不知道我错在哪里,它像一对翻转

import java.util.*;
public class recursion
{
    public static void main(String args[])
    {
        Scanner scanner = new Scanner (System.in);
        System.out.print("Enter a string: ");
        String str = sc.nextLine();
        System.out.print(revRec3(str));
    }

    public static String revRec3(String str)
    {
        if ((str.length() == 1)|| (str.length()==0 || str.length()==2))
        {
            return str;
        }

        String left = str.substring(0, (str.length() / 3)),
        middle = str.substring((str.length()/3) ,(str.length()-left.length())),
        right = str.substring((str.length()-middle.length()),str.length());
        String revLeft = revRec3(left);
        String revMiddle = revRec3(middle);
        String revRight = revRec3(right);

        return revRight + revMiddle + revLeft;
    }        
}

也许你正试图做到这一点

import java.util.Scanner;

public class Main {

  public static void main(String args[])
  {
    Scanner sc = new Scanner (System.in);
    System.out.print("Enter a string: ");
    String str = sc.next();
    System.out.print(revRec3(str));
  }



public static String revRec3(String str)
  {
    if ((str.length() == 1)|| (str.length()==0 || str.length()==2))
    {
  return str;
}

String left = str.substring(0, (str.length() / 3)),
    middle = str.substring((str.length()/3) ,(str.length()-left.length())),
    right = str.substring((str.length()-middle.length()+1),str.length());
String revLeft = revRec(left);
String revMiddle = revRec(middle);
String revRight = revRec(right);
return revRight + revMiddle + revLeft;


 }



private static String revRec(String middle) {
    StringBuilder sb = new StringBuilder(middle);
   return sb.reverse().toString();
  }
}

您有一个返回字符串未更改的基本情况:

str.length()==2

在这种情况下,您需要在返回字符串之前反转字符串。

我相信这就是您的目的

public static void main(String args[])
{
        Scanner scanner = new Scanner (System.in);
        System.out.print("Enter a string: ");
        String str = sc.nextLine();
        System.out.print(threeSplitString(str));
}

public static String threeSplitString(String str)
{
    if (str.length() < 3)
    {
        return str;
    }
    int len = str.length();

    String p1 = str.substring(len * 0 / 3, len * 1 / 3); // First Third
    String p2 = str.substring(len * 1 / 3, len * 2 / 3); // Second Third
    String p3 = str.substring(len * 2 / 3, len * 3 / 3); // Third Third

    // The recursion
    p1 = threeSplitString(p1);
    p2 = threeSplitString(p2);
    p3 = threeSplitString(p3);

    return p3 + p2 + p1;
}
publicstaticvoidmain(字符串参数[])
{
扫描仪=新的扫描仪(System.in);
System.out.print(“输入字符串:”);
字符串str=sc.nextLine();
系统输出打印(三分字符串(str));
}
公共静态字符串threeSplitString(字符串str)
{
如果(str.length()<3)
{
返回str;
}
int len=str.length();
字符串p1=str.substring(len*0/3,len*1/3);//第一个三分之一
字符串p2=str.substring(len*1/3,len*2/3);//第二个第三个
字符串p3=str.substring(len*2/3,len*3/3);//第三个
//递归
p1=threeSplitString(p1);
p2=threeSplitString(p2);
p3=threeSplitString(p3);
返回p3+p2+p1;
}

这里是我的javascript代码,希望对您有所帮助

function rev(input) {
  let len = input.length;
  if(len < 2) return input;
  if(len == 2) return input[1]+input[0];
  let left = input.substring(0, Math.round(len/3))
  let mid = input.substring(Math.round(len/3), Math.round(len-len/3))
  let right = input.substring(Math.round(len-len/3), len)

  return rev(right) + rev(mid) + rev(left);
}
功能版本(输入){
设len=input.length;
if(len<2)返回输入;
如果(len==2)返回输入[1]+输入[0];
设left=input.substring(0,数学四舍五入(len/3))
设mid=input.substring(Math.round(len/3),Math.round(len-len/3))
设right=input.substring(数学四舍五入(len-len/3),len)
返回转(右)+转(中)+转(左);
}
但我不知道为什么我们需要分为三个部分,我们已经有两个部分了

function rev(input) {
  let len = input.length;
  if(len < 2) return input;
  if(len == 2) return input[1]+input[0];
  let left = input.substring(0, Math.round(len/2));
  let right = input.substring(Math.round(len/2), len);

  return rev(right) + rev(left);
}
功能版本(输入){
设len=input.length;
if(len<2)返回输入;
如果(len==2)返回输入[1]+输入[0];
设left=input.substring(0,数学四舍五入(len/2));
设right=input.substring(数学四舍五入(len/2),len);
返回版本(右)+版本(左);
}

问题不在于如何反转字符串。这是一项测试程序员递归算法熟练程度的任务,可能会明确说明问题的确切含义:它必须将输入分成3部分,然后翻转这些部分,然后每个部分都必须使用递归进行反转。我投反对票,因为答案对这个问题没有用处。你到底为什么每次添加一个字符,而新的StringBuilder(s)却可以。reverse()。toString()可以吗?检查更新的代码,我认为这会解决你的问题。代码中仍然没有递归调用。似乎您不了解问题的范围,即什么是递归以及如何使用它。幸好你没有得到那份作业,因为你会失败。打印分割结果,你会发现错误:
HelloWorld
被分割成
Hel
loWo
orld
。哎呀!!
World
中的
o
包含两次。此外,如果输入长度为2个字符(并且将在其中一个递归上),则可以按原样返回,而不必反转。哎呀!!!没错,但不是唯一的问题。请看我对问题的评论。它仍在做同样的事情。不是“dlroWolleH”,而是“ldroWolleH”