按特定增量计数。递归通话的技术问题?

时间:2015-12-06 23:04:23

标签: java recursion

编写一个方法countToBy,它接受整数参数n和m,并产生一个输出,指示如何以逗号分隔的m为增量计数到n。

呼叫countToBy(25,4);印刷品:1,5,9,13,17,21,25

我的印刷品:,5,9,13,17,21,25

我不能只添加System.out.print(“1”);因为并非所有的呼叫都应该在开头打印1。除了第一个元素,代码工作正常。我已经尝试了所有东西以获得第一个元素,但要么我得到“111111”或根本没有。任何帮助,将不胜感激。

注意:这不是练习递归的功课! :)

public static void countToBy(int n, int m) {

  if(n < 1 || m < 1) {
    throw new IllegalArgumentException();
  }
  if(n == 0 || m == 0) {
    System.out.print("");
  }
  else {

    int store = n - m; 

    if(store > 0){
      countToBy(n - m , m );
      System.out.print (", " + n );  // issue is here
    }
  }     
}

3 个答案:

答案 0 :(得分:1)

主要问题是您的条件if(store > 0)会阻止您打印当前值。你应该做的是使用条件继续递归,但总是打印当前值n,因为如果它到达那一点,它会通过你之前的所有检查,所以它是一个有效的值。

更改

// ... rest of your code
int store = n - m;
if(store > 0){
      countToBy(n - m , m );
      System.out.print(", " + n );
}
// ...

要:

// ... rest of your code
int store = m - n;
if(store > 0){
    countToBy(store, m );     // use store instead of n-m because you already calculated that
    System.out.print(", ");   // print the comma inside the statement, because (store > 0) means we have more elements to come
} 
System.out.print(n);          // print the current element
// ...

此外,您的第二个if声明并非真正用于任何目的,因为如果nm为0,那么它将满足第一个if并且在没有达到第二个if的情况下抛出异常。因此,您可以将其删除。

以下是您的代码可缩短的内容(为简洁起见,我省略了if n < 1, m < 1检查):

public static void countToBy(int n, int m) {
   int store = n - m; 
    if(store > 0) {
        countToBy(store, m );
        System.out.print(", ");
    }
    System.out.print(n);
}

Here's a DEMO

答案 1 :(得分:0)

变化:

if(n == 1 || m == 1){
   System.out.print(n);
}

要:

n

m8 ** 6561永远不应该&lt;因为这会导致你已经检查过的错误,如果其中一个等于1,只需显示第一个字符。

答案 2 :(得分:0)

void countToBy(int to,int offset) {

        if (to == 0 || offset ==0) {
            System.out.print(0) ; //base caes
            return;
        }
        if ( to<=offset) {
            System.out.print(to) ; //base caes
            return;
        } else  {

            countToBy(to-offset,offset); //recursive step
            System.out.print (", "+to);
        }
    }