因此,我有一个问题,要求我编写一个传递由数字组成的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>。
答案 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
循环等效的递归函数?