質問は非常に理解するのが難しいです。
以前の計算に基づいて、要素の数とそれに関連する条件を (便利に) プログラムする方法はありますか?
問題は、この文の「プログラム」は実際には理解できる動詞ではないということです。なぜなら、人間はコンピューターをプログラムしたり、VCR をプログラムしたりしますが、「数値をプログラムする」ことはできないからです。だからここで何を言おうとしているのか理解できない。
しかし、コード レビューを行うことはできます。コード レビューを通じて、あなたが求めている質問を理解できるかもしれません。
未承諾のコード レビュー
行き止まりをなくして迷路を解こうとしているようですね。
あなたのコードが実際に行うことは次のとおりです。
行き止まりではない、または行き止まりに隣接していないセルのリストを生成します。filtered
ステップ 1 から一連の隣接セルを生成し、sequences
このような隣接する 4 つのシーケンスをルートに連結します。
大きな問題: これは、正しいルートの長さが正確に 8 タイルの場合にのみ機能します! この迷路を解いてみてください:
[E]-[ ]-[ ]-[ ]
| |
[ ]-[ ]-[ ]-[ ]
| |
[ ]-[ ]-[ ]-[ ]
| |
[ ]-[ ]-[ ]-[ ]
| |
[ ]-[ ]-[ ]-[E]
したがって、コードレビューからさかのぼって作業すると、あなたの質問は次のようになります。
リストの長さが事前にわからない場合、どうすればリストを生成できますか?
ソリューション
検索で迷路を解くことができます (DFS、BFS、A*)。
import Control.Monad
-- | Maze cells are identified by integers
type Cell = Int
-- | A maze is a map from cells to adjacent cells
type Maze = Cell -> [Cell]
maze :: Maze
maze = ([[1], [0,2,5], [1,3], [2],
[5], [4,6,1,9], [5,7], [6,11],
[12], [5,13], [9], [7,15],
[8,16], [14,9,17], [13,15], [14,11],
[12,17], [13,16,18], [17,19], [18]] !!)
-- | Find paths from the given start to the end
solve :: Maze -> Cell -> Cell -> [[Cell]]
solve maze start = solve' [] where
solve' path end =
let path' = end : path
in if start == end
then return path'
else do neighbor <- maze end
guard (neighbor `notElem` path)
solve' path' neighbor
この関数solve
は、深さ優先検索によって機能します。すべてを単一のリスト内包表記に入れるのではなく、再帰的に機能します。
start
からへのパスを見つけるためにend
、 の場合start /= end
、
端に隣接するすべてのセルを見てください, neighbor <- maze end
,
guard (negihbor `notElem` path)
cellをバックトラックしていないことを確認してください。
start
からへのパスを検索してみてくださいneighbor
。
一度に関数全体を理解しようとせず、再帰について少しだけ理解してください。
概要
セル 0 からセル 19 へのルートを見つけたい場合は、再帰します。セル 18 と 19 が接続されていることがわかっているので (これらは直接接続されているため)、代わりにセル 0 からセル 19 へのルートを見つける問題を解決することができます。セル18。
これが再帰です。
脚注
警備員、
someCondition a == True
に相当します。
someCondition a
したがって、次と同等です。
(someCondition a == True) == True
または、
(someCondition a == (True == True)) == (True == (True == True))
または、
someCondition a == (someCondition a == someCondition a)
最初のsomeCondition a
, は問題ありません。
do
表記に関する脚注
上記の例のdo
表記は、リスト内包表記と同等です。
do neighbor <- maze end
guard (neighbor `notElem` path)
solve' path' neighbor
リスト内包表記の同等のコードは次のとおりです。
[result | neighbor <- maze end,
neighbor `notElem` path,
result <- solve' path' neighbor]