1. ホーム
  2. javascript

[解決済み] Javascriptによるバイナリサーチ

2022-03-06 03:45:45

質問

JavaScriptでバイナリ検索アルゴリズムを実装しようとしています。 物事はうまくいっているように見えますが、私のreturn文は未定義を返しているように見えますか?何が間違っているのか、誰か教えてください。

フィドル http://jsfiddle.net/2mBdL/

ありがとうございます。

var a = [
    1,
    2,
    4,
    6,
    1,
    100,
    0,
    10000,
    3
];

a.sort(function (a, b) {
    return a - b;
});

console.log('a,', a);

function binarySearch(arr, i) {
    var mid = Math.floor(arr.length / 2);
    console.log(arr[mid], i);

    if (arr[mid] === i) {
        console.log('match', arr[mid], i);
        return arr[mid];
    } else if (arr[mid] < i && arr.length > 1) {
        console.log('mid lower', arr[mid], i);
        binarySearch(arr.splice(mid, Number.MAX_VALUE), i);
    } else if (arr[mid] > i && arr.length > 1) {
        console.log('mid higher', arr[mid], i);
        binarySearch(arr.splice(0, mid), i);
    } else {
        console.log('not here', i);
        return -1;
    }

}
var result = binarySearch(a, 100);
console.log(result);

解決方法は?

再帰的な内部呼び出しを明示的に返していない(つまり return binarySearch() そのため、コールスタックは戻り値なしで展開されます。このようにコードを更新してください。

// ...
if (arr[mid] === i) {
    console.log('match', arr[mid], i);
    return arr[mid];
} else if (arr[mid] < i && arr.length > 1) {
    console.log('mid lower', arr[mid], i);
    return binarySearch(arr.splice(mid, Number.MAX_VALUE), i);
} else if (arr[mid] > i && arr.length > 1) {
    console.log('mid higher', arr[mid], i);
    return binarySearch(arr.splice(0, mid), i);
} else {
// ...

をご覧ください。 ワーキングフィドル