Saltar al contento

Modulo:Exponential search

De Wikipedia, le encyclopedia libere
Info
Info
Documentation del modulo
Le documentation de iste modulo non existe ancora. Crea lo!

Le modification de iste modulo es limitate al usatores autoconfirmate

-- copiate e traducite desde [[:en:Special:Permalink/1138644443]]

-- Iste modulo forni un algorithmo generic de cerca exponential.
require[[strict]]

local checkType = require('libraryUtil').checkType
local floor = math.floor

local function midPoint(lower, upper)
	return floor(lower + (upper - lower) / 2)
end

local function search(testFunc, i, lower, upper)
	if testFunc(i) then
		if i + 1 == upper then
			return i
		end
		lower = i
		if upper then
			i = midPoint(lower, upper)
		else
			i = i * 2
		end
		return search(testFunc, i, lower, upper)
	else
		upper = i
		i = midPoint(lower, upper)
		return search(testFunc, i, lower, upper)
	end
end

return function (testFunc, init)
	checkType('Exponential search', 1, testFunc, 'function')
	checkType('Exponential search', 2, init, 'number', true)
	if init and (init < 1 or init ~= floor(init) or init == math.huge) then
		error(string.format(
			"Valor initial non valide ‘%s’ detegite in le secunde argumento passate a " ..
			"‘Exponential search’ (le valor initial debe esser un numero integre positive)",
			tostring(init)
		), 2)
	end
	init = init or 2
	if not testFunc(1) then
		return nil
	end
	return search(testFunc, init, 1, nil)
end