猿问

我如何循环遍历给定范围内的 N 个数字的排列,最好不使用递归?

我有N 个数字和一个范围,我必须在该范围内对数字进行排列。

例如,如果我有 3 个数字,范围为 1-2,我会循环1 1 11 1 21 2 1等。

最好但不是必须的,我怎样才能在不递归的情况下做到这一点?

对于一般想法,嵌套循环不允许任意数量的数字,并且由于深度太高,递归是不可取的(超过 1-10 的 3 个数字将超过 1,000 次调用使用这些数字的代码部分)


慕桂英4014372
浏览 117回答 1
1回答

函数式编程

实现此目的的一种方法是每个排列循环一次迭代,并使用循环变量来计算排列所产生的值。考虑到范围的大小可以用作模参数来“截断”将成为结果中的值(数字)之一的值(数字)。然后,如果将循环变量(好吧,它的副本)除以范围大小,则重复上述操作以提取另一个值,...等。显然,只有当结果数量不超过类型的容量int或用于循环变量的任何类型的容量时,这才有效。所以看起来是这样的:int [][] getResults(int numPositions, int low, int high) {&nbsp; &nbsp; int numValues = high - low + 1;&nbsp; &nbsp; int numResults = (int) Math.pow(numValues, numPositions);&nbsp; &nbsp; int results[][] = new int [numResults][numPositions];&nbsp; &nbsp; for (int i = 0; i < numResults; i++) {&nbsp; &nbsp; &nbsp; &nbsp; int result[] = results[i];&nbsp; &nbsp; &nbsp; &nbsp; int n = i;&nbsp; &nbsp; &nbsp; &nbsp; for (int j = numPositions-1; j >= 0; j--) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[j] = low + n % numValues;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n /= numValues;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return results;&nbsp;}您在问题中给出的示例将通过以下调用生成:int results[][] = getResults(3, 1, 2);那么结果是:1 1 11 1 21 2 11 2 22 1 12 1 22 2 12 2 2
随时随地看视频慕课网APP

相关分类

Java
我要回答