[JS] Домашно Arrays - 7 задача


2

Задачата гласи :

7.Write a program that finds the index of given element in a sorted array of integers by using the binary search algorithm (find it in Wikipedia).

Е погледнах в уикипедия, добре е обяснено. После писах, струвах, умувах и стигнах до следното решение, което определено не работи, но не мога да си обясня защо, просто защото браузъра ми крашва когато стартирам скрипта :/ Е, вие сте, помагайте, че го закъсах :D

Ето го и кода: http://jsbin.com/eCEnIdeQ/1/watch?html,js,output

П.П: В jsbin не крашва, но работи за 2/3 стойности максимум ;/

 




Отговори



1

Здравей,

Има няколко проблема. Най-напред в jsbin долу в червено светват 3 грешки:

  1. Line 2: var arr = [5, 3, 2, 9, 8, 12, 24, 52, 1, 4]; --- 'arr' is already defined. - това е така, защото и функцията и масива ти с еказват по един и същи начин. Преименувай си функцията например и я извиквай с новото име.
  2. Line 11: var key = parseInt(document.getElementById("number").value); --- Missing radix parameter - 
    parseInt(string, radix) т.е. иска винаги да посочваш 10 като radix - в десетична бройна система
    по подразбиране може и без това, явно в jsbin проверява
    
  3. Line 40: answer.innerHTML = outText + key + " is: " + result; --- 'result' used out of scope. Това е така, защото си дефинираш променлива в средата на цикъла и извън цикъла тя е с недефинирана стойност. Същото се отнася и за imid. Най-добре и тях ги изнеси при другите променливи.

Правилно сортираш масива. Но след като е сортиран, резултата ще бъде индекса на сортирания вече масив, а не на оригиналния.

Друг проблем е, че делението не връща цяло число - както ти очакваш за индекса. Мислиш си че imid е цяло число, но всъщност не е при тези сметки.

Успех!

 


от diana.pencheva (0 точки)


1
Здравей колега, вместо: var imid = imin+(imax - imin)/2; ако напишеш
var imid = imin+((imax - imin)/2) | 0; << така правиш целочислено деление, скобите съм ги допълнил за да се разбира по-добре последователността на операциите.
Вече една примерна сметка с imax = 9, imin = 0 ще изглежда така:
(9 - 0) / 2 = 4.5
4.5 | 0 = 4; << тук можеш да ползваш и Math.floor(4.5);
Успех!

от Plamen_Petkov (1255 точки)