var names = ["x", "leve", "prave"]
var mainFunction = "odmocni"
var datasets = [
{argv: [16, 0, 10], out: 4},
{argv: [17, 0, 10], out: 4.123105625617661},
{argv: [0.2, 0, 1], out: 0.4472135954999579},
{argv: [1000, 10, 100], out: 31.622776601683793},
{argv: [123456, 1, 2], out: 2},
]
Vašim úkolem je napsat funkci odmocnina(y, leve, prave)
, která odhaduje druhou odmocninu zadaného čísla někde v intervalu leve
a prave
.
V Pythonu to jde vyřešit na jeden řádek (jako v ukázkovém kódu), ale váš program nesmí výsledek přímo spočítat. Místo toho má postupovat takhle:
x
v půlce mezi leve
a prave
a tu umocní na druhou.x**2
dost blízko k y
, tak vrátí x
jako výsledek.x**2
je menší než y
, tak pokračuje do půlky mezi x
a prave
, a použije sebe samotnou, aby spočítala výsledek.x**2
je větší než y
, tak pokračuje do půlky mezi leve
a x
.Jestli je výsledek už "dost blízko", poznáte snadno funkcí abs
pro absolutní hodnotu, například abs(x**2 - y) < 0.001
.
Můžete případně využít toho, že odmocnina je křivka prohnutá nahoru, abyste se k výsledku dostali dřív: hodnota x
nemusí být přesně v polovině. Když ji zvolíte třeba v 45% nebo v 60% mezi leve
a prave
, tak program poběží rychleji nebo pomaleji.
Jsou mnohem lepší způsoby, jak odmocňovat. Tenhle je ale výživný z hlediska programování a nepotřebuje žádné matematické triky.
def odmocni(y, leve, prave):
return y ** 0.5
print(odmocni(16, 0, 10))
print(odmocni(17, 0, 10))
print(odmocni(0.2, 0, 1))
print(odmocni(1000, 10, 100))
print(odmocni(123456, 1, 2))