看板 Programming
作者 標題 Re: [請益] 用遞迴實作巢狀迴圈
時間 2010年06月14日 Mon. AM 01:57:46
※ 引述《Knuckles》之銘言:
當我們在進行多維複雜邊界陣列操作時,對於系統實際上是經由一系列的偏移運算對應的單純一維陣列
這種概念其實也可以應用於這種特殊的計數環境
================================================
例如,針對這樣的計數環境:
ValueRange[a,b,c]=[0 to 1,0 to 2,0 to 3];
實際上就是一個 x=0~24 的計數環境
將Range展開的語法
int Values=3;
//可自訂的維數
int ValueMax[Values]=[1,2,3];
//可自訂的上限值
int ValueMin[Values]=[0,0,0];
//可自訂的下限值
int i;
int ValueOffset[Values-1];
//宣告偏移轉換陣列
for(i=0;i<Values-1;i++) ValueOffset[Values]=ValueMax[Values]-ValueMin[Values]+1;
//取得每一維度的「項數」
for(i=1;i<Values-1;i++) ValueOffset[Values]*=ValueOffset[Values-1];
//累乘
================================================
每一個維度的偏移量是「累計」到「前一個維度」的「項數」
ex.0~2有三項,所以偏移為3
最高維度的項數用不到,不需要紀錄,所以資料長度Values-1
最低維度因為沒有前一個維度,不需要累計,所以從i=1開始累乘
在這個範例中,最終取得 ValueOffset[2]=[2,6]
================================================
接著,可以用簡單的算式在簡單數字x跟陣列計數[a,b,c]之間轉換
x=(a-ValueMin[0])+(b-ValueMin[1])*ValueOffset[0]+(c-ValueMin[2])*ValueOffset[1];
c=x \ ValueOffset[1];
b=x % ValueOffset[1] / ValueOffset[0];
a=x % ValueOffset[1] % ValueOffset[0];
註:"\"取商數, "%"取餘數
這裡我沒有迴圈來處理高維度的計數,不過上面的語法要改為迴圈並不困難
這部份就請各位回家自己試看看了
================================================
至於這樣搞的好處是什麼?
當要進行計數值大小比較及快速遷移的時候,這樣的計數轉換系統會有神一般的效率
尤其當計數的維度非常大,邊界又很詭異的時候
註:快速遷移, 例如計算 [0,1,2]+7的時候可以先轉成簡單數字,+7之後轉回來,而不需要累加7次
這樣的問題當維度很高一次遷移很遠的時候就會有明顯的差距
================================================
今天的課程就講到這裡,各位同學可以下課了
--
※ 來源: DISP BBS 看板: Programming 文章連結: http://disp.cc/b/33-3aw
※ 作者: SmallBee 來自: 122.116.180.163 時間: 2010-06-14 01:57:46
※ 編輯: SmallBee 來自: 122.116.180.163 時間: 2010-06-14 01:59:03
※ 同主題文章:
06-13 02:30 □ [請益] 用遞迴實作巢狀迴圈
06-13 04:43 Re [請益] 用遞迴實作巢狀迴圈
06-13 23:28 Re [請益] 用遞迴實作巢狀迴圈
● 06-14 01:57 Re [請益] 用遞迴實作巢狀迴圈
06-21 21:06 Re [請益] 用遞迴實作巢狀迴圈
10-23 18:48 Re [請益] 用遞迴實作巢狀迴圈
※ 看板: Programming 文章推薦值: 1 目前人氣: 0 累積人氣: 378
回列表(←)
分享