【问题标题】:Java Recursively add to listJava递归添加到列表
【发布时间】:2019-07-02 02:16:40
【问题描述】:

一切似乎都很好,但是这一行有一个错误:

return new ArrayList<Integer>(Arrays.asList(i, FACTORISATION(n/i)));

错误是:构造函数 ArrayList(Arrays.asList(i), ArrayList) 未定义

我知道错误表示 Array 的 asList 方法不采用 ArrayList,但是如何将 FACTORISATION 返回的项目添加到列表中?这个递归真的让我头疼

【问题讨论】:

  • 我认为错误信息不准确,但是您的第二个 return 语句没有意义。 Arrays.asList() 不会展平其输入。它只是将所有内容汇总到一个列表中。 Arrays.asList(i, FACTORISATION(n/i)) 返回一个List&lt;Object&gt;,你不能将它传递给List&lt;Integer&gt;
  • ArrayList&lt;Integer&gt; 没有足够的空间容纳列表。您必须单独创建列表并调用list.add(i); 然后list.addAll(FACTORISATION(n/i))。顺便说一句:for 循环中的return... 似乎是一个没有任何条件检查的错误。

标签: java


【解决方案1】:

Java 并不是真正的函数式编程语言,因此编写这样的函数式代码往往有点笨拙。

你想要这样的东西:

public static List<Integer> FACTORISATION(int n) {
    if (PRIME(n)) {
        // return a one-element array
        return Collections.singletonList(n);
    } else {
        // find a prime divisor, p
        for (int i = 2; i < Math.sqrt(n); i++) {
            List<Integer> newList = new ArrayList<>();
            newList.add(i);
            newList.addAll(FACTORISATION(n/i));
            return newList;
        }
        return Collections.emptyList();
    }
}

注意,我更改为返回接口类型List&lt;Integer&gt; 并使用Collections.singletonList

如果你可以使用 Guava 那就试试 ImmutableList,它更优雅一点。

public static List<Integer> FACTORISATION(int n) {
    if (PRIME(n)) {
        // return a one-element array
        return ImmutableList.of(n);
    } else {
        // find a prime divisor, p
        for (int i = 2; i < Math.sqrt(n); i++) {
            return new ImmutableList.Builder<Integer>()
                .add(i)
                .addAll(FACTORISATION(n/i))
                .build();
        }
        return Collections.emptyList();
    }
}

【讨论】:

  • 嗨,但递归方法不应该总是返回方法本身吗?
  • 我想你是说,递归方法 f 最后不应该有 return f(...) 之类的东西吗?不,它不必。你的也没有。它在最后一行调用FACTORISATION,但这不是它做的最后一件事。在它调用FACTORISATION(假设它可以编译)之后,它仍然必须调用asList并从结果中构建一个ArrayList。为了符合List API 的限制,我只是将其拆分为单独的行。
  • 有意思,谢谢!但是有没有更好的方法来附加到 java 中的列表,或者这对我来说是最好的方法吗?
  • 顺便说一下,你的代码没有默认的返回语句
  • 你的也没有 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2019-11-16
  • 2012-10-25
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多