为什么我的递归函数返回“ undefined”?

时间:2018-09-09 14:43:01

标签: javascript recursion undefined

该函数返回undefined,它是JavaScript中的简单二进制搜索代码。当我用console.log()检查时,该功能确实可以正常工作。下面是我的源代码:

var array=[1,2,3,2,4,5,6,8,7,8,9];
var searching= 3;
var starting = 0;
var ending = array.length-1;

var result = binarysearch(array,searching,starting,ending);
console.log(result); // throws undefined

function binarysearch(data,target,start,end){

var mediane = Math.round((start+end)/2);

if (data[mediane] == target) return mediane;  // console.log(mediane) gives 2 
if (data[mediane] > target) binarysearch(data,target,start,mediane-1);
if (data[mediane] < target) binarysearch(data,target,mediane+1,end);

2 个答案:

答案 0 :(得分:1)

非常简单。使用return跟踪调用堆栈。

var array=[1,2,3,2,4,5,6,8,7,8,9];
var searching= 3;
var starting = 0;
var ending = array.length-1;

var result = binarysearch(array,searching,starting,ending);
console.log(result); // throws undefined


function binarysearch(data,target,start,end){

var mediane = Math.round((start+end)/2);

if(data[mediane] == target) return mediane;  // console.log(mediane) gives 2 
if ( data[mediane] > target) return binarysearch(data,target,start,mediane-1);
if ( data[mediane] < target) return binarysearch(data,target,mediane+1,end);

}

说明:

使用递归调用时,控件从一个函数分支转到另一个函数分支。为了返回一个确定的值,您需要传递控件(函数上下文或知道程序现在在何处执行的事物)。您没有返回递归分支;这意味着执行栈正在创建一个新函数,并且由于没有得到输出,因此将其视为一个单独的分支。

当您执行return时,上下文知道它必须将函数分支出来并使用最终的返回值:在这种情况下为2。我希望这有帮助! :)

答案 1 :(得分:0)

在对return的递归调用中使用binarysearch关键字。如果没有return,则函数显然将返回undefined

var array=[1,2,3,2,4,5,6,8,7,8,9];
var searching= 3;
var starting = 0;
var ending = array.length-1;

var result = binarysearch(array,searching,starting,ending);
console.log(result); // throws undefined


function binarysearch(data,target,start,end){

var mediane = Math.round((start+end)/2);

if(data[mediane] == target) return mediane;  // console.log(mediane) gives 2
if ( data[mediane] > target) return binarysearch(data,target,start,mediane-1);
if ( data[mediane] < target) return binarysearch(data,target,mediane+1,end);

}