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:简单的递归问题的主要内容,如果未能解决你的问题,请参考以下文章