解释此递归算法以打印多个数字的所有有序数字

时间:2012-10-12 20:22:02

标签: java math recursion

我有这个代码来打印所有“有序”数字的多个数字,给定位数

(如果数字为xyz,则按iff x< y< z)排序,

代码有效,但我无法理解for循环中使用的逻辑。这是递归,但如果有人能解释得更多,那就太棒了。

class OrderedNumbers{

    public static void main(String args[]){
        printOrdered(0,0,3); // 3 digit numbers
    }

    private static void printOrdered(int number, int prev, int n) {

        if(n==0){
            System.out.println(number);
            return;
        }

        for(int i=(prev+1); i<(11-n); i++){
            printOrdered(number*10 + i, i, n-1) ;
        }

    }

}

3 个答案:

答案 0 :(得分:3)

看看这些论点。

  • number是到目前为止编号。在我们添加最后一位数之前,我们将它乘以10,以便在该数字上再追加一位数。
  • prev是前一个数字的值。 for循环将在此之后启动,从而确保数字中的数字是有序的。
  • n是尚未追加的位数。当达到零时,已达到最大递归深度并打印数字。我们还在计算n循环的上限时使用for。最后一个数字可以不大于9,第二个数字不能大于8,依此类推。你可以从n=1条件中读取i<10,即i<=9这一事实看出这一点。

递归调用将传递前一个数字,并附加一个数字,该数字的值以确保后一个数字更大,并且剩余数字的数量减少一个。

答案 1 :(得分:1)

函数的最后一个参数控制函数调用自身的次数。当printOrdered在循环中调用自身时,它会获取当前数字并将其乘以10(将数字移到左边的一个位置)。然后它添加i(将它放在那里)。当n=0函数知道已添加所有必要的数字时,它返回(打印)当前数字。

i从前一个数字开始运行(否则它不是有序数字)到11-n,这表示在数字n的数字中,最多有效数字只能与11-n一样大。考虑具有3位789的最大有序数。数百个地方永远不会超过7,你明白为什么吗?

总结

  • number是当前(可能不完整)的有序号码
  • prev是添加到number
  • 的最后一位数字
  • n是需要添加到number
  • 的位数
  • i遍历可以添加到下一个number的所有数字。它必须大于最后一位数字,但仍然留有余地,以便在再次调用printOrdered时添加剩余的数字。

答案 2 :(得分:1)

首先,请注意,对于要“订购”的数字,最左边的数字必须小于(11-n),其中n是数字位数。如果您正在使用3位数字,则会订购“789”,但如果最左边的数字是8,然后是9,则没有更高的数字可以填充最右边的位置。 (所有其他数字也是如此。)

在第一次调用printOrdered时,for循环生成可在最左侧位置使用的所有有效数字。对于每个这样的数字,递归调用生成可以在第二到最左位置使用的所有有效数字,依此类推。 number是一个累加器,用于建立要打印的数字,而n倒计时直到要打印的数字完全建立起来。 prev被误导地命名;它是显示在此的数字。对于要“订购”的数字,您只能生成高于的数字而不是prev,这就是循环变量初始化为prev + 1的原因。