我正在尝试用Java编写一个递归函数来打印数字1到n。 (n是您发送函数的参数。)迭代解决方案非常简单:
public static void printNumbers(int n){
for(int i = 1; i <= n; i++){
System.out.println(i);
i++;
}
作为一名新程序员,我很难弄清楚这种方法的递归版本是如何工作的。
答案 0 :(得分:3)
您正在使用从i=1
迭代到n
的for循环。正如你想用递归做的那样,更容易传递n
而不是i
和 n
,我们只是颠倒了整个事情,所以我们算了向下n
到1
。为了保持打印的顺序,我们首先调用递归函数并在执行后打印数字:
public static void printNumbers ( int n )
{
if ( n > 0 )
{
printNumbers( n - 1 ); // n - 2, if the "i++" within the for loop is intended
System.out.println( n );
}
}
对于简单的迭代 - &gt;递归转换很容易将循环更改为这样的格式:
public static void printNumbers ( int n )
{
int i = 1;
while ( i <= n )
{
System.out.println( i );
i++; // i += 2, if the "i++" within the for loop is intended
}
}
现在您可以轻松地将其转换为递归函数:
public static void printNumbers ( int n, int i )
{
if ( i <= n )
{
System.out.println( i );
i++; // i += 2, if the "i++" within the for loop is intended
printNumbers( n, i );
}
}
其他一切都是优化。
答案 1 :(得分:1)
递归版本需要两个参数(n
和i
),因此请将其作为辅助非公共方法,并从public方法调用它以开始递归:
static void auxPrintNumbers(int n, int i){
if(i <= n) {
System.out.println(i);
auxPrintNumbers(i + 1);
}
}
public static void printNumbers(int n){
auxPrintNumbers(n, 1);
}
答案 2 :(得分:1)
您的迭代版本存在一些问题:您在i
语句中迭代for
两次,然后在循环结束时再次;你也应该让i < n
成为循环的结束条件。
要回答你的问题,显然递归函数必须打印出当前数字,如果当前数字尚未达到n,则再次调用自身 - 所以它必须取当前数字(我们正在调用{迭代版本中的{1}}作为参数 - 或者类需要将其作为实例变量保存,但我会坚持使用参数。
答案 3 :(得分:1)
根据你的函数打印从1到n的每个奇数,递归函数看起来像这样:
public static void printNumbersRecursive(int n)
{
if (n % 2 == 0) printNumbersRecursive(n - 1);
else if (n > 0)
printNumbersRecursive(n - 2);
System.out.println(n);
}
如果是错误,并且您想打印从1到n的每个数字,那么:
public static void printNumbersRecursive(int n)
{
if (n > 0)
printNumbersRecursive(n - 1);
System.out.println(n);
}
答案 4 :(得分:1)
班级版本(只是为了好玩):
class R {
private final int n;
public R (final int n) {
if (n <= 0) {
throw new IllegalArgumentException("n must be positive");
}
this.n = n;
}
@Override
public String toString () {
final StringBuilder sb = new StringBuilder();
if (this.n > 1) {
sb.append(new R(this.n - 1).toString());
}
sb.append(this.n).append(" ");
return sb.toString();
}
}
用作:
System.out.println(new R(10));
答案 5 :(得分:0)
public static void printNumbers(int n){
if( n > 1 ){
printNumbers(n - 1);
}
System.out.println(n);
}
此函数递归调用自身,直到达到n = 1.从这一点开始,所有值都按正确的顺序打印:1,2,3,...