2017-06-01 71 views
0

我想用Javascript寫一個遞歸函數,但顯然我錯過了一些東西,我無法讓它返回到我想要的位置。 在以下示例中,我期望在日誌中看到baz = 18,但baz未定義。Javascript的遞歸使用返回undefined

https://jsfiddle.net/n8fg1h3v/1/

任何想法?

function foo(arr) { 
    if (arr[0]==7) { 
    return 18 
    } else { 
    arr = arr.slice(1,arr.length); 
    foo(arr); 
    } 
} 

var arr1 = [9,1,2,3,4,7,6]; 
var baz = foo(arr1); 
console.log(baz) 
+0

請注意,雖然你可以重新分配('ARR = ...' )在Javascript,無論你想要的,這是相當罕見的在遞歸算法中。將表達式作爲參數傳遞('foo(arr.slice(...))') – ftor

回答

3

您需要返回調用foo函數內部。

return foo(arr); 

function foo(arr) { 
 
    if (arr[0] == 7) { 
 
     return 18; 
 
    } else { 
 
     arr = arr.slice(1, arr.length); 
 
     return foo(arr); 
 
    } 
 
} 
 

 
var arr1 = [9, 1, 2, 3, 4, 7, 6]; 
 
var baz = foo(arr1); 
 
console.log(baz)

+0

這很快,非常感謝! – luthien

+2

如果數組中沒有「7」,你喜歡使用默認值嗎? –

+0

不,這只是一個簡單的例子來展示並試圖理解爲什麼我的'if then else'語句和'if'裏面的'return'沒有像我期望的那樣工作。按照你的建議,添加'return foo(arr)'就可以在簡單的例子中正常工作,而且在我真正的問題中。謝謝! (我不能接受另一個〜10分鐘的答案,我會在那之後再做。) – luthien

0

我只想做到這一點:

function foo(arr) { 
 
    var el = arr.find(el => el === 7); 
 
    return el ? 18 : '7 was not found'; 
 
} 
 

 
var bar = foo([9, 1, 2, 3, 4, 7, 6]); 
 
console.log(bar); 
 

 
var baz = foo([9, 1, 2, 3, 4, 8, 6]); 
 
console.log(baz);

+0

我會使用'some',因爲它打破了迭代,但它與遞歸無關。 –

+0

也'Array.prototype.find()'打破迭代..我理解你的觀點遞歸,但在這裏我不認爲這是必要的 –