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

Posted

技术标签:

【中文标题】递归计算JAVA中字符串中的字符【英文标题】:Recursively count characters in a string in JAVA 【发布时间】:2020-03-15 10:24:49 【问题描述】:

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

【问题讨论】:

从描述你想要做什么开始。 public String cccc() return "cccc";你不需要递归。 @LowKeyEnergy 我正在尝试打印字符串“s”中的“nth”字符,从 1 而不是 0 开始,这就是为什么 n = 3 == c 而不是 a。 如果 N=3 并且 s="abcabcabcabc" 那么“字符串 s 中的第 N 个字符”就是“c”......所以根据您自己的解释,您需要一个只打印“ c"。 输入s = "abcabcabcabc"(长度为12)和n = 3,所以s.length() % n = 12 % 3 = 0,也就是说return s.charAt(n-1) + "";使得方法返回"c" 【参考方案1】:

这是一种方式

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

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

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

【讨论】:

【参考方案2】:

这是一种带有一点参数检查的方法。这个想法是与递归调用一起发送一些状态。每次调用都会修改下一次调用的状态(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, n, startingIndex + n);
    
    return "";

【讨论】:

【参考方案3】:

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

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

public String countChar(String s, char c) 
    if (s.length() == 0) return "";
    return (s.charAt(0) == c ? c : "") + countChar(s.substring(1),c);

【讨论】:

返回所有出现的 c,但不是每个第 n 个字符。 哇,我想我真的没有仔细阅读这个问题。 哟,我并不陌生;)

以上是关于递归计算JAVA中字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章

递归计算对象在字符串中出现的次数

如何处理java中的递归Stack Overflows

在Python中计算字符串的长度时,“递归深度超出错误”

python-027-递归-求序列最大值、计算第n个调和数、转换字符到整数

在 C++ 中使用递归计算和说

使用递归来查找字符串中的“hi”数而不是“xhi”