亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何循環遍歷給定范圍內的 N 個數字的排列,最好不使用遞歸?

我如何循環遍歷給定范圍內的 N 個數字的排列,最好不使用遞歸?

慕桂英4014372 2023-07-28 09:53:25
我有N 個數字和一個范圍,我必須在該范圍內對數字進行排列。例如,如果我有 3 個數字,范圍為 1-2,我會循環1 1 1、1 1 2、1 2 1等。最好但不是必須的,我怎樣才能在不遞歸的情況下做到這一點?對于一般想法,嵌套循環不允許任意數量的數字,并且由于深度太高,遞歸是不可取的(超過 1-10 的 3 個數字將超過 1,000 次調用使用這些數字的代碼部分)
查看完整描述

1 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

實現此目的的一種方法是每個排列循環一次迭代,并使用循環變量來計算排列所產生的值。考慮到范圍的大小可以用作模參數來“截斷”將成為結果中的值(數字)之一的值(數字)。然后,如果將循環變量(好吧,它的副本)除以范圍大小,則重復上述操作以提取另一個值,...等。


顯然,只有當結果數量不超過類型的容量int或用于循環變量的任何類型的容量時,這才有效。


所以看起來是這樣的:


int [][] getResults(int numPositions, int low, int high) {

    int numValues = high - low + 1;

    int numResults = (int) Math.pow(numValues, numPositions);

    int results[][] = new int [numResults][numPositions];

    for (int i = 0; i < numResults; i++) {

        int result[] = results[i];

        int n = i;

        for (int j = numPositions-1; j >= 0; j--) {

            result[j] = low + n % numValues;

            n /= numValues;

        }

    }

    return results; 

}

您在問題中給出的示例將通過以下調用生成:


int results[][] = getResults(3, 1, 2);

那么結果是:


1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

2 2 2


查看完整回答
反對 回復 2023-07-28
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號