我一直在尋找遞歸的真實世界的例子。請記住,編程嚮導,我和藝術家,並在Photoshop腳本(腳本模式操作)它通常用於循環所有圖層和子圖層。遞歸沒有超過
我正在處理(簡單)遞歸腳本來解決四位數組合鎖。你知道,從1開始,然後嘗試2,然後3等,直到找到解決方案。爲了讓事情變得簡單,第二個數字是正確的,所以我們知道我們不需要改變它。初始狀態的數字從零開始,但我們知道最終解決方案中沒有零。
- 該嘗試必須匹配的解決方案,也加起來10以便 被解決。
這看起來似乎有點不穩定,但我想把解決方案的兩個部分放在一起,主要是因爲我可以應用我學到的東西並編寫一個蠻力suduko求解器。但是,你必須爬之前,你可以滑冰...
var puzzle = [0,2,0,0]; // source
var solution = [1,2,3,4];
var s = superCopy(puzzle); // working array
drawPuzzle(s);
solvePuzzle(s, puzzle);
var total = checkTotal(s, solution);
var solution = checkSolution(s, solution);
function checkTotal(arr, source)
{
var c = 0;
// count the total
for (var i = 0; i < arr.length; i++)
{
c += arr[i];
}
if (c == 10)
{
alert("Total OK")
return true;
}
}
function checkSolution(arr, source)
{
// check the solution
for (var i in arr)
{
if (arr[i] != source[i]) return false
return true;
}
}
function solvePuzzle(arr, source)
{
for (var i = 0; i < arr.length; i++)
{
// check the source
var sourceCell = source[i];
//alert("checking source " + sourceCell)
//if it's a zero we can change it
if (arr[i] == 0)
{
cell = arr[i];
cell+=1;
if (cell > 4) cell = 0;
arr[i] = cell;
}
}
// check the solution
for (var i in arr)
{
// overflow time!
if (arr[i] != source[i]) solvePuzzle(arr, source)
else
{
alert("All done!")
}
}
}
function drawPuzzle(arr)
{
var p = "";
var c = 0;
for (var i = 0; i < arr.length; i++)
{
if (arr[i] == 0) p += "-"
else p += arr[i];
c+=1;
}
alert(p);
}
function superCopy(arr)
{
// returns a true copy of an array
tempArr = new Array();
for (var i = 0; i < arr.length; i++)
{
if (arr[i] == 0) tempArr[i] = 1 // changed, thanks Nostradamnit!
else tempArr[i] = arr[i]
}
return tempArr
}
的腳本是不完整的。這是我迄今爲止,它溢出錯誤。注意solvePuzzle和checkTotal函數沒有被調用,因爲我意識到solvePuzzle需要調用它自己並找出解決方案......當我遇到溢出問題並且有點困惑時。
我意識到這種類型的問題危險地靠近「修復我的代碼」冒險,所以我準備爲它付出恩典。謝謝。
糟糕!我錯過了。我現在修復了超級複製。不,錯誤發生在solvePuzzle(s,puzzle) –
我認爲你將進入一個無限循環,因爲solvePuzzle中的第一個沒有做任何事情。如果第一個if內部檢查arr [i] == 0,但superCopy函數確保所有索引等於0,所以這個條件永遠不會出現,然後繼續對未改變的數組進行遞歸,繼續不改變成無限。重新審視你的邏輯;) – Nostradamnit