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

时间:2015-12-04 05:55:01

标签: java recursion

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

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

3 个答案:

答案 0 :(得分:1)

这样做,没有过多的字符串连接,并且没有正确的缩进:

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

输出

    aj
   abij
  abchij
 abcdghij
abcdefghij
    a
   abi
  abchi
 abcdghi
abcdefghi

说明

第二种print方法应该非常明显:打印indent空格,打印leftLen中的str字符,以及rightIdx开头的所有字符。如果没有这样做,可以减少一次缩进,左起一次,右起一次。

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

第一次调用应始终从左侧打印1个字符,这很简单。

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

答案 1 :(得分:0)

请检查以下修改版本的打印功能

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

答案 2 :(得分:0)

尝试使用2种方法

1. for even , e.g, 

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

    {
    //Method for Even
    }

2. for odd , e.g, 

    else

    {
    //Method for odd
    }