Почему моя рекурсивная функция возвращает "undefined"? - PullRequest
0 голосов
/ 09 сентября 2018

Функция возвращает 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 голосов
/ 09 сентября 2018

Используйте ключевое слово 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);

}
0 голосов
/ 09 сентября 2018

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

...