如何使用递归方法返回字符串中的数字总和?

时间:2018-10-26 19:30:01

标签: java string recursion int

因此,我有一个问题,要求我编写一个传递由数字组成的String的方法,该方法应返回这些数字的总和。因此,如果String为“ 123”,则我的方法应返回值6。如果传递了空String,则我的方法应返回零。它要求我使用递归。这是我到目前为止的内容:

public class Q2 {


public static void main(String[] args) { 

String s = "135";
System.out.println(sumDig(s));
}

public static String sumDig(int num)
{
  int i = Integer.parseInt(num);
  int sum = 0;
  if (i == 0)
    return sum;
  int sum = num%10 + sumDig(num/10);
  return sum;
  } 
}

尝试查看我是否在正确的轨道上时遇到了一些麻烦,我知道那完全是不方便的,递归对我来说仍然很奇怪,因此我们非常感谢您的帮助。谢谢!

编辑:我不认为这是任何其他问题的重复,这些问题询问如何使用递归查找数字总和,这非常相似,但是却有所不同,因为它要求从 String < / strong>。

6 个答案:

答案 0 :(得分:1)

人们指出的关键问题是您已经颠倒了方法签名:

public static String sumDig(int num)

应为:

public static int sumDig(String num)

我们还要解决另一个问题,即您获取了可以直接处理的数据,使其变得更加复杂,然后进行处理。让我们直接处理您得到的东西:

public class Q2 {

    public static int sumDig(String digits) {

        int sum = 0;

        if (! digits.isEmpty()) {
            sum += Character.getNumericValue(digits.charAt(0)) + sumDig(digits.substring(1));
        }

        return sum;
    } 

    public static void main(String[] args) { 
        System.out.println(sumDig(args[0]));
    }
}

用法

% java Q2 123
6
%

答案 1 :(得分:0)

// TODO not working with negative numbers
public static int sumDig(String str) {
    return str.isEmpty() ? 0 : str.charAt(0) - '0' + sumDig(str.substring(1));
}

public static int sumDig(int num) {
    return Math.abs(num) < 10 ? Math.abs(num) : (Math.abs(num) % 10 + sumDig(num / 10));
}

答案 2 :(得分:0)

这是递归方法的三种变体,它们在参数和返回类型方面有所不同,但是它们在增加输入编号和打印输出方面都起到了相同的作用。

// Recursive method where parameter is int and return type String
public static String getSumStr(int n) {
    n = n < 0 ? -n : n; // takes care of negative numbers
    if (n < 10) {
        return String.valueOf(n);
    }
    return String.valueOf(n % 10 + Integer.parseInt(getSumStr(n / 10)));
}

// Recursive method where parameter and return type both are int
public static int getSum(int n) {
    n = n < 0 ? -n : n; // takes care of negative numbers
    return n < 10 ? n : (n % 10 + getSum(n / 10));
}

// Recursive method where parameter and return type both are String
public static String getSumStr(String s) {
    if (s == null || s.length() == 0) {
        return "0";
    }
    if (s.length() == 1) {
        return s;
    }
    return String.valueOf(Integer.parseInt(s.substring(0, 1))
            + Integer.parseInt(getSumStr(s.substring(1, s.length()))));
}

答案 3 :(得分:0)

在下面的评论中,我希望您看到您犯的逻辑和语法错误:

public static String sumDig(int num) {
    // the return type should be int and not String
    // the parameter num should be String and not int

    int i = Integer.parseInt(num);
    int sum = 0;
    if (i == 0)
        return sum;
    int sum = num%10 + sumDig(num/10);
    // sum has been previously declared as int, so int is not required in the above line
    // the number is i and this should be used and not num (which is a String)
    // in the calculations
    // num/10 cannot be used as a parameter of sumDig because sumDig needs
    // a String parameter

    return sum;
}

这并不意味着如果进行所有建议的更正,则该方法将按预期工作。例如,当字符串为null等时会发生什么?

答案 4 :(得分:0)

假设字符串为全数字,则以下内容适用于长度大于Integer.MAX_VALUE的字符串

public static void main(String[] args) {
    String s = "123344566777766545";
    long i = sumDig(s);
    System.out.println(i);
}

public long sumDig(String s) {
    return sumDigits(s.toCharArray(), 0);
}

public long sumDigits(char[] chars, int index) {
    if (index == chars.length - 1) {
        return chars[index] - '0';
    }
    return sumDigits(chars, index + 1) + (chars[index] - '0');
}

答案 5 :(得分:-1)

我会给您一个提示:如果您对字符串中的字符进行for循环并以这种方式添加数字会发生什么?我建议尝试编写这样的for循环。这是我正在谈论的一个示例(对此表示歉意,因为它使用C#而不是Java-语法非常相似):

string s = "123";

int sum = 0;

for (int i = 0; i < s.Length; i++)
{
    sum += int.Parse(s[i].ToString());
}

在那之后,您将如何编写与for循环等效的递归函数?