Бисекционный поиск: в случае ie возвращает меньшее значение - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь учиться на промежуточных экзаменах и борюсь с этой проблемой. Вопрос в следующем:

Найдите такой целочисленный показатель степени, чтобы base**exponent было ближе всего к num. Обратите внимание, что base**exponent может быть больше или меньше num. В случае at ie верните меньшее значение. Я получил все, кроме того, как вернуть меньшее значение в случае ie.

Это мой код, а функция closest_power(3,12) продолжает работать между показателями степени 3 и 2 (правильный код вернет 2). Любая помощь приветствуется

def closest_power(base, num):
    exponential = base+num/2
    increment = 1
    while  abs(num-base**exponential) >= 0.01:
        print ("Exp: {}, Our number = {}, correct number: {}".format(exponential,base**exponential, num))
        if num > (num-base**exponential-2) and num <  (num-base**exponential):
            return expontential-1

        if base**exponential > num:
            exponential -= 1

        else:
            exponential += 1


    return exponential

print(closest_power(3,12))

Ответы [ 2 ]

4 голосов
/ 20 июня 2020

Ваш тест на то, находится ли num между двумя показателями, неверен, он должен быть

num > base**(exponential-1) and num < base**exponential

, который также может быть записан как

base**(exponential-1) < num < base**exponential

Также у вас есть опечатка,

return expontential-1

должно быть

return exponential-1

, и вы должны установить начальное значение как

exponential = (base + num) // 2

, чтобы убедиться, что это целое число, но было бы даже больше эффективно, чтобы установить его на:

exponential = num // base

Всего:

def closest_power(base, num):
    exponential = num // base
    increment = 1
    while  abs(num-base**exponential) >= 0.01:
        print ("Exp: {}, Our number = {}, correct number: {}".format(exponential,base**exponential, num))
        if base**(exponential-1) < num < base**exponential:
            return exponential-1

        if base**exponential > num:
            exponential -= 1

        else:
            exponential += 1


    return exponential

print(closest_power(3,12))

Вывод:

Exp: 4, Our number = 81, correct number: 12
Exp: 3, Our number = 27, correct number: 12
2
0 голосов
/ 20 июня 2020

Вы можете упростить задачу с помощью журнала.

Ваш вопрос: 3 ** x = 12. Найти x?

Применить журнал

x * log3 = log12

x = log12 / log3

Используя этот подход:

def exp(x,y):
   return(int(log(y)/log(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...