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