2015-12-04 30 views
2

我的程序使用遞歸以三角形的形式來打印一個字符串打印字符串:基本情況爲使用遞歸當字符串長度爲奇數

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

您還可以向我們展示所需的輸出嗎?您打算在每次遞歸期間刪除多少個字符?您的代碼似乎目前一次刪除2個字符,但是奇數長度的字符串會發生什麼情況? –

+1

我只是說看起來像輸入「ABCDEFGHI」,一個奇怪的長字符串,第一行打印@ TIM-biegeleisen –

回答

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空間,打印從strleftLen性格,和所有的字符開始rightIdx。如果沒有完成,則遞減一個縮進,左起一個,右起一個字符。

尋找在所述採樣輸出,的indent值應該4兩個長度10和長度9,所以(str.length() - 1)/2將計算。

首先調用應該始終打印從左側1字符,所以這是簡單的。

現在,rightIdx的初始值應該是9用於偶數長度10,所以j將被打印,並且也應該是9對於奇數長度9,所以什麼都不會被打印。因此,對於長度10/9,我們減去1得到9/8,然後設置最低位(| 1)使其成爲9/9

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

什麼樣應當:「AI」和最後一行打印「abcdeffghi」 –

+0

對不起,我忘了刪除一行。你可以請評論'last = str.charAt(end + 1)+ last;'這裏面的if(start == end)' – prasad

+0

@i_use_the_internet如果這解決了你的問題,你能接受嗎? – prasad

0

嘗試做有2種方法

1. for even , e.g, 

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

    { 
    //Method for Even 
    } 

2. for odd , e.g, 

    else 

    { 
    //Method for odd 
    } 
+0

請嘗試解釋你的技巧,而不是複製粘貼。 – Saad

相關問題