|
/** |
|
* Declaring an array with predefind first two elements of fibonacci sequence. |
|
* This array will store all fibonacci numbers. |
|
*/ |
|
const fibonacciList = [0, 1]; |
|
|
|
/** |
|
* This is the Main @function nextFibonacci which will take an input array. |
|
* @param {Array} arr: this is the given array to find the fibonacci numbers. |
|
*/ |
|
function nextFibonacci(arr) { |
|
/** |
|
* Validating the given param if it's an array or not & checking if Empty. |
|
*/ |
|
if (Array.isArray(arr) && arr.length > 0) { |
|
/** |
|
* Finding the maximum integer among the given array. |
|
*/ |
|
const maxInteger = Math.max(...arr); |
|
constructFibonacci(maxInteger); |
|
/** |
|
* Iterating over the given array to find fibonacci numbers. |
|
*/ |
|
return arr.map(elm => { |
|
const nextFib = searchNextFibonacci(fibonacciList, elm, 0, fibonacciList.length - 1); |
|
console.log(nextFib); |
|
return nextFib; |
|
}); |
|
} |
|
} |
|
|
|
/** |
|
* This @function constructFibonacci is used to create fibonacci sequence. |
|
* @param {Integer} maxV is the maximum value in the given array. |
|
*/ |
|
function constructFibonacci(maxV) { |
|
let i = 1; |
|
/** |
|
* Finding all the fibonacci numbers until next greter fibonacci number than maxV is found. |
|
*/ |
|
while (fibonacciList[i] < maxV) { |
|
i++; |
|
fibonacciList[i] = fibonacciList[i - 1] + fibonacciList[i - 2]; |
|
} |
|
} |
|
|
|
/** |
|
* This @function searchNextFibonacci is used to search for a next greater |
|
* fibonacci value than given value. |
|
* @param {Array} fibArr is an Array if fibonacci numbers. |
|
* @param {Integer} num an element of given array. |
|
* @param {Number} start starting index of the fibonacci array. |
|
* @param {Number} end last index of the fibonacci array. |
|
*/ |
|
function searchNextFibonacci(fibArr, num, start, end) { |
|
/** |
|
* Validation condition |
|
*/ |
|
if (start > end) return 'Provided an empty array'; |
|
/** |
|
* Finding the middle index |
|
*/ |
|
const mid = Math.floor((start + end) / 2); |
|
/** |
|
* Compare middle index value with the given num |
|
* if both equal next number of the array. |
|
*/ |
|
if (fibArr[mid] === num && fibArr[mid + 1] !== num) return fibArr[mid + 1]; |
|
/** |
|
* Comparing if num is greater than arr[mid] and |
|
* if num is less than arr[mid + 1] then return arr[mid + 1]. |
|
*/ |
|
if (num > fibArr[mid] && num < fibArr[mid + 1]) return fibArr[mid + 1]; |
|
/** |
|
* Comparing if num is greater than arr[mid - 1] and |
|
* if num is less than arr[mid] then return arr[mid]. |
|
*/ |
|
if (num < fibArr[mid] && num > fibArr[mid - 1]) return fibArr[mid]; |
|
/** |
|
* If element at middle is greater than num then search in the left half |
|
* or else search in the right half of mid |
|
*/ |
|
return fibArr[mid] > num ? |
|
searchNextFibonacci(fibArr, num, start, mid - 1) : |
|
searchNextFibonacci(fibArr, num, mid + 1, end); |
|
} |
|
|
|
nextFibonacci([1, 22, 9]); |