Java:简单递归问题
我对递归的整个概念非常陌生,老实说,这让我有点发疯。我想把我写的这个函数变成一个递归函数Java:简单递归问题,java,if-statement,recursion,char,return,Java,If Statement,Recursion,Char,Return,我对递归的整个概念非常陌生,老实说,这让我有点发疯。我想把我写的这个函数变成一个递归函数 public static int to_number(String s) { int total = 0; int n=s.length(); for(int i = 0 ; i < n ; i++) { char c = s.charAt(i); if (Character.isDigit(c)){ int valu
public static int to_number(String s)
{
int total = 0;
int n=s.length();
for(int i = 0 ; i < n ; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)){
int value=Character.getNumericValue(c);
total +=value;
}
}
System.out.println(total);
return total;
}
我觉得我离得很近,但就是不明白。谢谢你的时间和努力 不提供代码,但作为递归函数,您希望处理输入字符串的第一个字符,然后使用剩余字符串调用自己,即
到_number(s.substring(1))
,并合并结果。当输入字符串为空时,递归结束。试试这个
public void intToNum(String s, int total[])
{
if(s.isEmpty())
return;
char c = s.charAt(0);
if (Character.isDigit(c)){
int value=Character.getNumericValue(c);
total[0] +=value;
}
intToNum(s.substring(1),total);
}
在main中,将函数调用为
int [] total = new int[1];
intToNum(input,total);
System.out.println(total[0]);
或者另一种方法是
公共整数整数(字符串s)
{
此答案包含解决方案。当您陷入困境时,请查看它。我还鼓励您阅读和理解代码,而不是复制代码。这是编程中最重要的概念之一,因此请确保您理解并熟悉它。:) 工作原理:该方法接收一个字符串。如果字符串长度超过1个字符,则该方法将其拆分为两半,在两个子字符串上调用自身并添加两个结果。这些调用将执行相同的操作,直到字符串片段长度仅为1(或0)个字符。在这种情况下,它只返回其值(如果没有值,则返回0)
公共类递归VSIteration{
公共静态void main(字符串[]args){
字符串str=“2.938fyfh0293urhp2398rpod8723uoihr98y”;
System.out.println(“迭代:+toNumberIterative(str));
System.out.println(“递归:+toNumberRecursive(str));
}
公共静态整数(字符串s){
int-total=0;
int n=s.长度();
对于(int i=0;i
乍一看,这是无法编译的。您正在尝试调用to_号码(字符串)
方法没有参数。那么,您面临的实际问题是什么?@dguay传递s
将导致无限递归。OP需要传递s
@azurefrog的子字符串。您说得对,我的错!您应该传递字符串和当前索引,以便将字符提取到函数中。从INDER开始x=0,并且每次调用都会递增。这样if(i==n)
会有意义的。你应该能够继续这个技巧。简单地将总计作为方法的输出传回不是更容易吗?为什么总计是一个数组?是的,我很好奇为什么你将总计作为一个数组?你不也需要在intToNum调用中添加一个数组,而不仅仅是一个字符串吗?好的,我知道你现在做了什么,不是吗我想这样做,但嘿,这是我递归学习的开始!谢谢,我真的很感激!
int [] total = new int[1];
intToNum(input,total);
System.out.println(total[0]);
if(s.isEmpty())
return 0;
char c = s.charAt(0);
if (Character.isDigit(c)){
int value=Character.getNumericValue(c);
return value + intToNum(s.substring(1));
}
return intToNum(s.substring(1));
}
public class RecursionVsIteration {
public static void main(String[] args) {
String str = "2.938fyfh0293urhp2398rpod8723uoihr98y";
System.out.println("Iterative: " + toNumberIterative(str));
System.out.println("Recursive: " + toNumberRecursive(str));
}
public static int toNumberIterative(String s) {
int total = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
int value = Character.getNumericValue(c);
total += value;
}
}
return total;
}
public static int toNumberRecursive(String s) {
int n = s.length();
// termination criteria
if (n == 0) { // emtpy string
return 0;
}
if (n == 1) { // on character string
char c = s.charAt(0);
return Character.isDigit(c) ? Character.getNumericValue(c) : 0;
}
// recursive call (split the string in half and call the method on both substrings)
return toNumberRecursive(s.substring(0, n / 2)) + toNumberRecursive(s.substring(n / 2, n));
}
}