2016-04-30 19 views
0

所以,我們都知道這個遞歸函數的教師是如何工作的:你怎樣才能恢復不可協調的值?

public static int fac(int number) { 
    return (number > 1) ? number * fac(number - 1) : number; 
} 

如果調用此5作爲參數,它會評估爲:

return 5 * 4 * 3 * 2 * 1 

到目前爲止,一切都很好。但是如果我想要返回的值不能被連接起來呢?例如,如果我想返回一些列表:

public static List<Integer> getSubarraysOf(List<Integer> array) { 
    if (array.size() <= 1) { 
     return array; 
    } 
    return array + getSubarraysOf(array.subList(1,array.size() - 1)); 
} 

當然,這是行不通的!我可以想象這個工作的唯一方法是引用全局變量(即包含列表的列表),將結果列表添加到該列表,或者將結果列表引入參數。這兩個解決方案都有味道,我想知道有沒有人有比我更聰明的解決方案。

回答

0

您是否在尋找解決方案這樣的

public static void main(String [] args) 
    List<Integer> list = new ArrayList<>(); 
    for (int i = 1; i < 6; ++i) list.add(i); 
    System.out.println("1### " + list); 
    System.out.println("2### " + getSubArraysOf(list)); 
} 

private static List<Integer> getSubArraysOf(List<Integer> array) { 

    List<Integer> result = new ArrayList<>(); 
    for (int i = 0; i < array.size(); ++i) { 
     result.addAll(array.subList(0, array.size() - i)); 
    } 
    return result; 
} 

與結果如下

1### [1, 2, 3, 4, 5] 
2### [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1] 

也許像

public static void main(String [] args) 
    List<Integer> list = new ArrayList<>(); 
    list.add(5); 
    System.out.println("1### " + list); 
    System.out.println("2### " + getSubArraysOf(list)); 
} 

private static List<Integer> getSubArraysOf(List<Integer> array) { 

    int lastItem = array.get(array.size() - 1); 
    if (lastItem == 1) return array; 
    array.add(--lastItem); 
    return getSubArraysOf(array); 
} 

與結果

1### [5] 
2### [5, 4, 3, 2, 1] 
+0

我想我想要的只是不可能的,返回多個對象。我本來想要一個包含所有子數組的List,所以我可以單獨處理每個子數組。 – AdHominem

+0

我這麼認爲,只有外部列表<列表> – Batiaev