Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
Java 当字符串长度为奇数时,使用递归打印字符串的基本情况_Java_Recursion - Fatal编程技术网

Java 当字符串长度为奇数时,使用递归打印字符串的基本情况

Java 当字符串长度为奇数时,使用递归打印字符串的基本情况,java,recursion,Java,Recursion,我的程序使用递归以三角形的形式打印字符串: Sample input: "abcdefghij" Sample output: aj abij abchij abcdghij abcdefghij Sample input: "abcdefghi" Sample output: a abi abchi abcdghi abcdefghi 问题是,只有当字符串长度为偶数时,这种方法才有效。请问如何调整基本大小写以打印中间字符? 这是我的密码: public class Di

我的程序使用递归以三角形的形式打印字符串:

Sample input: "abcdefghij"
Sample output:
aj
abij
abchij
abcdghij
abcdefghij

Sample input: "abcdefghi"
Sample output:
    a
   abi
  abchi
 abcdghi
abcdefghi
问题是,只有当字符串长度为偶数时,这种方法才有效。请问如何调整基本大小写以打印中间字符? 这是我的密码:

public class DisplayTriangle
{
  public static void main(String[]parms)
  {
    print ("abcdefghij");
  }
  public static void print(String str)
  {

    int mid = str.length()/2;
    String first="";
    String last="";
    print(str,0,str.length()-1,first,last);
  }

  public static void print(String str, int start, int end,String first, String last)
  {
    if( start >= end ||  end <=start )
    {
      return;
    }
    first+=str.charAt(start);
    last =  str.charAt(end)+last;
    System.out.println( first+ last );
    print(str, (start+1), (end-1), first, last);
  }
}
公共类DisplayTriangle
{
公共静态void main(字符串[]parms)
{
印刷品(“abcdefghij”);
}
公共静态无效打印(字符串str)
{
int mid=str.length()/2;
字符串优先=”;
字符串last=“”;
打印(str,0,str.length()-1,first,last);
}
公共静态无效打印(字符串str、int start、int end、字符串first、字符串last)
{

如果(开始>=结束| |结束,请检查下面修改的打印功能版本

public static void print(String str, int start, int end,String first, String last)
  {
  if( start > end ||  end <start )
  {
    return;
  }
if(start==end){
    first+=str.charAt(start);
    last =  str.charAt(end+1)+last;
    System.out.println( first+ last );
    return ;
}
first+=str.charAt(start);
last =  str.charAt(end)+last;
System.out.println( first+ last );
print(str, (start+1), (end-1), first, last);
}
公共静态无效打印(字符串str、int start、int end、字符串first、字符串last)
{

如果(开始>结束| |结束尝试使用两种方法

1. for even , e.g, 

    if(string.length()%2==0)

    {
    //Method for Even
    }

2. for odd , e.g, 

    else

    {
    //Method for odd
    }

这可以做到,无需过度的字符串连接,并且缩进正确:

private static void print(String str) {
    if (! str.isEmpty())
        print(str, (str.length() - 1) / 2, 1, (str.length() - 1) | 1);
}
private static void print(String str, int indent, int leftLen, int rightIdx) {
    for (int i = 0; i < indent; i++)
        System.out.print(' ');
    System.out.println(str.substring(0, leftLen) + str.substring(rightIdx));
    if (leftLen < rightIdx)
        print(str, indent - 1, leftLen + 1, rightIdx - 1);
}
a
阿比
阿卜奇
abcdghi
abcdefghi
解释

第二种
print
方法应该非常明显:print
indent
空格,print
leftLen
字符来自
str
,所有字符都从
rightIdx
开始。如果不这样做,则以较少的缩进,从左侧多缩进一个,从右侧提前一个字符的方式递归

查看示例输出,长度
10
和长度
9
indent
值应为
4
,因此
(str.length()-1)/2
将计算该值

第一次调用应该总是从左边打印
1
字符,所以这很简单


现在,偶数长度
10
rightIdx
的初始值应为
9
,因此将打印
j
,奇数长度
9
的初始值也应为
9
,因此不会打印任何内容。因此,对于长度
10
/
9
我们减去
1
,得到
9
8,然后设置最低位(
| 1
)要使其成为
9
/
9

您还可以向我们展示所需的输出吗?您打算在每次递归过程中删除多少个字符?您的代码当前似乎一次删除2个字符,但奇数长度字符串会发生什么情况?我刚刚添加了示例应该是@tim biegleisenfor input的样子“abcdefghi”,一个奇数长度的字符串,第一行打印“ai”,最后一行打印“abcdefghi”对不起,我忘了删除一行。你能评论一下
last=str.charAt(end+1)+last;
if(start==end)里面吗
block@i_use_the_internet如果这解决了您的问题,您能接受吗?请尝试解释您的技术,而不是复制粘贴。