首页 > 解决方案 > 递归计算JAVA中字符串中的字符

问题描述

如果我有一个 stringabcabcabcabc和一个 int N 3,我正在尝试返回"cccc"。我知道如何使用for循环来做到这一点,但我不知道如何使用递归来做到这一点。

非常感谢任何帮助。

这是我到目前为止所拥有的:

public String everyNth(String s, int n){
    if(s.length() % n == 0){
        return s.charAt(n-1) + "";
    }
    else {
        return everyNth(s.substring(n, s.length()), n);
    }
}

到目前为止,它只打印“c”而不是“cccc”。

标签: javastringrecursionsubstring

解决方案


这是一种方式

public String everyNth(String s, int n) {
    if (s.length() >= n) {
        return s.charAt(n - 1) + everyNth(s.substring(n), n);
    } else {
        return "";
    }
}

您可以制定一个不需要对返回结果做任何事情的尾递归版本。像 Scala 这样的一些语言可以使用它来进行优化,以避免有限的堆栈深度(和 StackOverflow 异常),但不能像现在一样使用java 。

public String everyNthAcc(String s, String acc, int n) {
    if (s.length() >= n) {
        return everyNthAcc(s.substring(n), acc + s.charAt(n - 1), n);
    } else {
        return acc;
    }
}

@Test
public void tryIt() {
    assertEquals("cccc", everyNthAcc("abcabcabcabc","", 3));
}

因此,就目前而言,每个堆栈帧的大小越小,递归就越深,这应该使它更进一步,虽然有点奇怪:

public class EveryNth {

    String value = "abcabcabcabc";
    StringBuilder sb = new StringBuilder();
    int nth = 3;

    @Test
    public void tryIt() {
        everyNthAgain(nth);
        assertEquals("cccc", sb.toString());
    }

    public void everyNthAgain(int curr) {
        if (curr <= value.length()) {
            sb.append(value.charAt(curr - 1));
            everyNthAgain(curr + nth);
        }
    }
}

推荐阅读