java - 递归计算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”。
解决方案
这是一种方式
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);
}
}
}
推荐阅读
- javascript - 如何在另一个元素 REACT 上更改元素 onClick 的样式?
- node.js - 没有从 NodeJs 中的 PugJS 表单获取数据
- api - 将 Netlogo 与外部代理连接
- ios - Flutter build ios 错误:找不到“BUNDLE_ID”的配置文件
- telegram - 如何从内联键盘获取数据作为单一结果?
- c - AF_XDP:从堆栈中间接读取无效
- python - Django TestCase:GET 请求应该返回 404 但在我的测试中返回 200...?
- r - 如何在更改名称的循环中使用 R 中的 write.dat
- angular - 为什么 Angular 的 dblclick 指令在 IE 中不起作用?
- python - python和Queue中的线程导致内存泄漏或内存错误