Очень просто. Используйте 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
. Надеюсь, это поможет! :)