我知道這可能是基本且簡單的,但由于我是自學的,所以我想知道哪里出了問題,我認為這是最好的學習場所。
我正在嘗試撰寫一個回傳 true 或 false 的遞回代碼。檢查的條件是這組詞是否可以構成給定的目標詞。
我一直得到的錯誤是:
if (targetString.indexOf(dictionary[i]) == 0) {
^
RangeError: Maximum call stack size exceeded
at String.indexOf (<anonymous>)
我很確定代碼的問題出在我回來的方式上,因為我總是覺得它很混亂。
我的代碼是:
let targetString = "furniture";
let dictionary = ["fur", "ure", "nit"];
const tableData = {};
const canConstructRecursive = (targetString, dictionary) => {
if (targetString == "") {
return true
}
for (let i = 0; i < dictionary.length; i ) {
if (targetString.indexOf(dictionary[i]) == 0) {
shorterTargetString = targetString.slice(0, dictionary[i].length);
return canConstructRecursive(shorterTargetString, dictionary);
}
}
return false;
}
console.log(canConstructRecursive(targetString, dictionary));
我正在學習遞回,有時我覺得我不明白回傳下一個/上一個遞回呼叫的邏輯。
如果有人能幫助我解決我做錯的事情并改變我的思維方式,我將不勝感激。
我的思路是:
如果在那個階段達到基本情況,則回傳基本情況,否則回圈遍歷所有選項,并且內部節點或上層堆疊需要將值回傳到下層堆疊,因此我在 for 內部執行 return canConstructRecursive() 。如果即使所有選項都是for回圈的迭代,也沒有回傳,最后回傳false。
先感謝您
uj5u.com熱心網友回復:
原因是盡管您的變數名為 named shorterTargetString,但不能保證它真的更短。如果i是 中最短單詞的索引dictionary,那么您的字串不可能通過遞回來變短。
錯誤是切片不應該從0開始,而是在匹配的部分之后,因此從slice呼叫中洗掉第一個引數。
這將解決堆疊溢位錯誤。
其次,如果遞回呼叫回傳,false您不應該放棄,而是繼續嘗試下一個單詞。所以只有return當你true從遞回中獲得時才退出回圈:
let targetString = "furniture";
let dictionary = ["fur", "ure", "nit"];
const tableData = {};
const canConstructRecursive = (targetString, dictionary) => {
if (targetString == "") {
return true
}
for (let i = 0; i < dictionary.length; i ) {
if (targetString.indexOf(dictionary[i]) == 0) {
shorterTargetString = targetString.slice(dictionary[i].length);
if (canConstructRecursive(shorterTargetString, dictionary)) {
return true;
};
}
}
return false;
}
console.log(canConstructRecursive(targetString, dictionary));
更多關于第二個修復。
您的代碼將無條件地回傳遞回呼叫的值,即使它是false. 這不好:如果遞回呼叫回傳false,呼叫者應繼續其for回圈以嘗試替代方案。
例如,讓我們在示例詞典中添加一個詞:您會同意添加詞典詞不應改變輸入“家具”的結果。所以這里是:
["furn", "fur", "ure", "nit"]
但令人驚訝的是:您的代碼現在回傳false“家具”!這是因為“furn”數學,但是以“iture”作為第一個引數的遞回呼叫沒有找到進一步的匹配,所以它回傳false,現在呼叫者也回傳false。這是錯誤的。它應該放棄“furn”,而不是整個練習。它應該繼續并嘗試使用“毛皮”。這就是為什么退出for回圈應該只在成功時發生,而不是在失敗時發生。只有在嘗試了所有字典單詞后才能確認失敗,因此for只要沒有遞回成功,回圈就必須繼續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/335031.html
標籤:javascript 算法 递归 数据结构
