Необходимо передать обновленные l
и u
в качестве параметров рекурсивному методу. То, что вы делаете, это присваиваете одинаковые значения l
(= 0) и u
(= n-1) в каждом вызове. Другими словами, каждый рекурсивный вызов не решает проблему меньшего размера . Это та же самая проблема и, следовательно, она приводит к переполнению стека.
Вот псевдокод.
int binarySearch(int v, int l, int u) {
if (l <= u) {
find mid
is the element at mid:
return 1;// Can be 'mid' to return the index at which it was found.
should we go left:
return binarySearch(v, l, mid - 1);
should we go right:
return binarySearch(v, mid + 1, u);
}
return -1; //Not found
}
. Обратите внимание:
l <= u
). Это позволит нам обнаружить состояние отсутствующего элемента и завершить рекурсию. return
в каждом рекурсивном вызове, без которого вы всегда будете возвращать -1. ОБНОВЛЕНИЕ:
Если у вас l
и u
объявлен статический статус, вам необходимо обновить их перед выполнением рекурсивного вызова.
int binarySearch(int v) {
if (l <= u) {
find mid
is the element at mid:
return 1;// Can be 'mid' to return the index at which it was found.
should we go left:
u = mid - 1
return binarySearch(v);
should we go right:
l = mid + 1
return binarySearch(v);
}
return -1; //Not found
}
Примечание. Перед вызовом этого метода необходимо установить l = 0
и u = n - 1
.
Может быть простое решение, но я создал бы третий класс как такой
class BookList{
MyBookObject a;
AmazonBookObject b;
}
список этого третьего класса мог быть передан Вашему представлению сразу.
Послушайте: http://www.castleproject.org/monorail/faq.html#NVelocity%20View%20Engine
Вы могли бы получить доступ к словарю в NVelocity через
$amazonbook.get_Item($index)