Java:简单的递归问题

Java: Simple Recursion Issue

我对递归的整个概念非常陌生,老实说,这让我有点吃惊。我正在尝试将我编写的这个函数变成递归函数...

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

它读入一个字符串,比如“3aaa6a3”,遍历这个字符串,如果char是一个数字,它就把它加到总数上,依此类推。到目前为止我所拥有的...

    public static int to_number(String s)
{
    int total = 0;
    int n=s.length();
    int i=0;
    if (i == n){
        return 0; //if gone through the whole string
    }
    char c = s.charAt(i);
        if (Character.isDigit(c)){
            int value=Character.getNumericValue(c);
            total +=value;
        }

    System.out.println(total);
    i++;
    to_number(); //trying to call the same function
    return total;
}

我觉得我很接近,但就是不明白。感谢您的时间和努力!

不会给你代码,但是作为一个递归函数,你想处理输入字符串的第一个字符,然后用剩下的字符串调用自己,即to_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);

}

在您的主程序中,将函数调用为

int [] total = new int[1];

intToNum(input,total);

System.out.println(total[0]);

或者另一种方法是

public int intToNum(字符串 s) {

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

}

此答案包含解决方案。卡住的时候看看就好了。我还鼓励您阅读和理解代码,而不是仅仅复制它。 这是编程中最重要的概念之一,因此请务必理解并熟悉它。 :)

工作原理:该方法接收一个字符串。如果字符串长于 1 个字符,则该方法将其分成两半,在两个子字符串上调用自身并将两个结果相加。这些调用将做同样的事情,直到字符串片段只有 1(或 0)个字符长。在那种情况下,它只是 returns 它们的值(或者 0,如果没有值)。

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