【问题标题】:Is recursion possible with different return and parameter types是否可以使用不同的返回和参数类型进行递归
【发布时间】:2020-07-04 07:51:05
【问题描述】:

我有一个方法签名,其中返回类型是字符串数组,参数是字符串。我必须将传递给方法的字符串分解为长度为 3 的子字符串,并返回一个包含所有子字符串作为元素的数组。 这也是递归完成的。

但是我得到的方法签名的返回类型与参数不同,所以递归是否可以在这些条件下工作:

private String[] substrings(String string) {...

【问题讨论】:

  • 是的,这很正常,没问题。
  • 是的,尽管递归通常通过辅助函数起作用。第一个函数设置参数,然后调用递归工作的辅助函数。但是你的函数是一个可以递归工作的函数。
  • 好的,我明白了。我试图将传递给方法的字符串分解为长度为 3 的子字符串,然后递归地返回一个子字符串数组作为元素,无法确定从哪里开始

标签: java recursion return


【解决方案1】:

当然是,为什么不呢?参数类型和返回类型之间没有任何关系。

这是一个事件处理器的例子,它甚至没有返回类型:

void processEvent(Event e) {
    // do something with the event

    processEvent(getNextEvent())
}

processEvent(getNextEvent());

这是一个斐波那契数列生成器的示例,它具有不同的参数(数字)和返回(数字数组)类型:

long[] fibonacci(long n) {
    if (n == 0) return new long[] { 1 };
    if (n == 1) return new long[] { 1, 1 };

    long[] a = fibonacci(n);
    long[] b = fibonacci(n-1);

    long[] both = Arrays.copyOf(a, a.length + b.length);
    return System.arraycopy(b, 0, both, a.length, b.length);
}

对于您的示例,它看起来像这样:

// Pseudocode only !!!
String[] substrings(String s) {
    if (s.size <= 3) return new String[] { s };
    return (new String[] { s.slice(0, 3) }).concat(substrings(s.slice(3)));
}

【讨论】:

  • 哇。没想到concatenating two arrays was that complicated。我很高兴我不懂 Java。
  • 公平地说,大多数时候您不是在使用 Java 中的数组。大多数情况下,如果您确实需要 一个数组,您只需通过 List 或 Stream 即可到达那里。绝大多数时候你在 Java 中有“一堆东西”,它是某种形式的集合。也许不是 as 内存效率高,但是当 JVM 已经在运行并且(可能)占用比程序更多的内存时,数组是一种极端的微优化。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 2015-03-22
  • 1970-01-01
相关资源
最近更新 更多