我有这个代码来打印所有“有序”数字的多个数字,给定位数
(如果数字为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) ;
}
}
}
答案 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
的原因。