Java:简单的递归问题

Posted

技术标签:

【中文标题】Java:简单的递归问题【英文标题】:Java: Simple Recursion Issue 【发布时间】:2016-01-23 11:31:22 【问题描述】:

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

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(String) 方法。 那么,您面临的实际问题是什么? @dguay 传递 s 将导致无限递归。 OP 需要传递s 的子字符串。 @azurefrog 你说得对,我的错! 您应该将要查看的字符串和当前索引传递给函数。从 index = 0 开始并在每次调用中递增。这样if ( i == n) 就有意义了。您应该能够继续使用此提示 【参考方案1】:

不会给你代码,但是作为一个递归函数,你想处理输入字符串的第一个字符,然后用剩余的字符串调用你自己,即to_number(s.substring(1)),并结合结果。当输入字符串为空时递归结束。

【讨论】:

【参考方案2】:

试试这个

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

或者另一种方法是

public int intToNum(String 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));


【讨论】:

简单地将总数作为方法的输出传递回来不是更容易吗? 为什么total是一个数组? 是的,我很好奇你为什么把总作为一个数组? 难道你不需要在 intToNum 的调用中添加一个数组,而不仅仅是一个字符串吗? 好吧,我知道你现在做了什么,不是我想的那样做,但嘿,这是我递归学习的开始!谢谢,我真的很感激!【参考方案3】:

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

它是如何工作的:该方法接收一个字符串。如果字符串长于 1 个字符,则该方法将其分成两半,在两个子字符串上调用自身并将两个结果相加。这些调用将做同样的事情,直到字符串片段只有 1(或 0)个字符长。在这种情况下,它只返回它们的值(或 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));
    

【讨论】:

以上是关于Java:简单的递归问题的主要内容,如果未能解决你的问题,请参考以下文章

简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。

JAVA递归算法

JAVA——进阶语法——递归算法的概念和简单应用举例

在Java中递归删除目录

Java基础------递归(Java实现)

java 中递归的实现 以及利用递归方法实现汉诺塔