非遞迴演算法嘗試1!

2022-04-02 11:41:20 字數 1440 閱讀 8749

苦思無果之餘,某群友發了個帖子給我,我一看,同樣是求2點間所有路徑的演算法,用的是c++和結點棧。

想法非常獨特,引用了乙個線的定義。完美解決了遞迴改為迴圈中的路徑標記問題。

於是本人辛辛苦苦弄了半天終於把遞迴改為了while迴圈+結點棧。

測試後雷了……

花的時間竟然比原來的遞迴還多一點!我這是何苦來哉、、、

其實作者文章開頭就已經宣告了,效率不高。

但沒想到比遞迴還要低,那還不如用遞迴呢?

該帖位址俺就不貼了。

下面是改過後的**。估計是路徑標記的判斷和更新花費太多時間。看來需要從其他方面下手了。

private linkedlistpaths;//當前鍵值集合

private linkedlist pathlist;//所有路徑列表

public int pathlistindex=-1;//路徑列表index

public int totalpathnum = 0;//總路徑數

public int maxface = 0;//當前統計出的最大面數

public int maxfaceid = 0;//

stopwatch timer;

public int times;

bool[,] pointispath;

bool[,,,] lineispath;

public void research ()

//第一次迴圈,判斷周圍是否有終點,是否閉合

int i = 0;

int x=0;

for (x = 0; x < j; x++)//遍歷四周可走格仔-pach和空位

else if (temfacenum == maxface)//如果等於當前最大面數

goto exitwhile;

}else if (paths.contains(dir[x]) && ++i > 1)//有2格是路徑,說明閉合了。放棄

}//二次迴圈,遍歷四周可走格仔,只要右路就進,同時設定標識

for (x = 0; x < j; x++)//遍歷四周可走格仔-pach和空位

}if (x < j) continue;//如有路徑,直接迴圈

else

}exitwhile://找到路徑 || 此路不通 || 迴圈無路

paths.removelast();//出棧;

pointispath[pointin.x, pointin.y] = false;//取消標記

//更新line標記

}//while

times[0] = (int)timer.elapsed.totalmilliseconds - times[0];

debug.writeline("-----------------------------");

debug.writeline(times[0]);

}

遞迴與非遞迴演算法

一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...

遞迴演算法向非遞迴演算法轉換

遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...

遞迴演算法向非遞迴演算法轉換

遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...