在JAVA中递归计算字符串中的字符

如果我有一个字符串abcabcabcabc和一个整数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”。

poiplkj 回答:在JAVA中递归计算字符串中的字符

那是一种方式

def rect(x):
    y=x
    for i in range(len(x)):
        if abs(x[i]) <= 0.5:
            y[i] = 1
        else:
            y[i] = 0
    return y

您可以制定尾部递归版本,该版本不需要对返回的结果做任何事情。诸如Scala之类的某些语言可以将其用于优化,从而避免了有限的堆栈深度(和StackOverflow异常),但避免使用Java,例如for now

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

就目前而言,每个堆栈框架的尺寸越小,递归就越深,这应该使它更进一步,但有点怪异:

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));
}
,

这是一种带有少量参数检查的方法。这个想法是与递归调用一起发送一些状态。每个调用都会在下一个调用时修改状态(startingIndex)。当状态超过某个条件时,递归将停止。在递归调用展开时,将组装结果字符串。

public static void main(String... args) {
    System.out.println(everyNth("abcabcabcabc",3));
}

public static String everyNth(String s,int n) {
    if (n < 0) {
        return "";
    }
    return everyNth(s,n,n - 1);
}

public static String everyNth(String s,int n,int startingIndex) {
    if (startingIndex < s.length()) {
        return s.charAt(startingIndex) + everyNth(s,startingIndex + n);
    }
    return "";
}
,

这是一种不依赖传递索引的方法,对于循环而言,这似乎比递归要多得多。

它使用终止条件,在每次调用时更改起始参数,并使用返回值堆栈返回结果。如果需要,可以用硬编码的'c'替换char参数。

public String countChar(String s,char c) {
    if (s.length() == 0) return "";
    return (s.charAt(0) == c ? c : "") + countChar(s.substring(1),c);
}
本文链接:https://www.f2er.com/3070638.html

大家都在问