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));
}
}
我对递归的整个概念非常陌生,老实说,这让我有点吃惊。我正在尝试将我编写的这个函数变成递归函数...
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));
}
}