顯示廣告
隱藏 ✕
Disp BBS guest 註冊 登入(i) 線上人數: 70
看板 Programming
作者 SmallBee(蜜蜂貓)
標題 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
※ 看板: Programming 文章推薦值: 1 目前人氣: 0 累積人氣: 378 
1樓 時間: 2010-06-14 02:40:31 (台灣)
  06-14 02:40 TW
看世足中 明天再來看程式
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇