你如何递归 return 不可连接的值?

How can you recurisvely return non-concatable values?

所以我们都知道这个递归的 faculty 函数是如何工作的:

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

如果您使用 5 作为参数调用它,它将计算为:

return 5 * 4 * 3 * 2 * 1

到目前为止,还不错。但是,如果无法连接我想要 return 的值怎么办?例如,如果我想 return 一些列表:

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

这当然不行!我能想象到的唯一方法是引用一个 全局变量 (是一个包含列表的列表),将结果列表添加到其中,或者将结果列表作为 参数。两种解决方案都有异味,我想知道是否有人有比我更聪明的解决方案。

您是否正在寻找这样的解决方案

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]