2017-06-01 70 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()'打破迭代..我理解你的观点递归,但在这里我不认为这是必要的 –