【问题标题】:Java: Simple Recursion IssueJava:简单的递归问题
【发布时间】: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) 就有意义了。您应该能够继续使用此提示

标签: java if-statement recursion char return


【解决方案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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多