2016-02-27 3 views
1

Так возникает вопрос, как это, я новичок в Python:В любом случае, чтобы инверсная факториальная функция?

Защиту factorial_cap (Num): Для положительного целого числа п, факторный п (обозначается как п!), Является продукт всех положительных целых чисел от 1 до n включительно. Реализуйте функцию, которая возвращает наименьший
положительный n такой, что n! больше или равно аргументу num. o Предположение: num всегда будет положительным целым числом.

# Examples 
# factorial_cap(20) output is 4 since 3!<20 but 4!>20 
# factorial_cap(24) output is 4 since 4!=24 
# factorial_cap(1) output is 1 since 1!=1 

# And here is what I got 

def factorial_cap(num): 
    n = 1 
    for i in range (1,num+1): 
     n = n*i  

Я уверен, что это правильная функция для factorial def. Но я просто не мог понять, вместо того, чтобы получать «общую стоимость», как я могу получить правильный результат, когда я разместил пример выше?

Btw, следует ли использовать «возврат» в конце def, или это не имеет значения в этом случае?

+0

Попробуйте использовать «return n» после цикла for. Также в вашем цикле измените 'range (1, num + 1)' на 'range (2, num + 1)', вам не нужно снова умножать число на 1. – Rolbrok

+0

Это домашнее задание? –

+0

@BasSwinckels Конечно, это так. –

ответ

2

Необходимо провести проверку, когда текущая сумма больше или равна запрашиваемому номеру. Таким образом, вы можете использовать условие цикла while для выполнения этой проверки и увеличивать счетчик i, который отслеживает текущую итерацию. Тогда это вопрос о возвращении текущего значения i, который произвел значение> = необходимое количество:

def factorial_cap(num): 
    n = 1 
    i = 1 
    while n < num: 
     i += 1 
     n *= i 
    return i 

>>> factorial_cap(20) 
4 
>>> factorial_cap(24) 
4 
>>> factorial_cap(25) 
5 
>>> factorial_cap(1) 
1 
>>> factorial_cap(3628800) 
10 
0

Если вы можете использовать факториальную функцию в своем решении, то решение довольно просто, потому что вы можете просто проверить, когда i-й факториал больше num. Вот решение:

def fact(num): 
    if num == 0 or num == 1: 
     return 1 
    f = 1 
    for i in range(2, num + 1): 
     f *= i 
    return f 

def fact_cap(num): 
    i = 1 
    while fact(i) < num: 
     i += 1 
    return i 
+0

Я просто хотел указать, что решение mhawke лучше с точки зрения производительности, так или иначе. Но это, с другой стороны, очень интуитивно понятно для кода и понимания. – nbro

0

Вы хотите вернуться, но это не n, но i

def factorial_cap(num): 

    n = 1 
    i = 0 

    while True: 

     i += 1 
     n = n*i 
     if n >= num: 
      break 

    return i 

print(factorial_cap(20)) 
print(factorial_cap(24)) 
print(factorial_cap(1)) 
-3

Вы хотите использовать рекурсию в это время, так как это облегчает вам задачу -

def fact(n): 
    print(factorial(n)) 

def factorial(n): 
    if n==0 or n==1: 
     return 1 
    else: 
     return n*factorial(n-1) 



And sample run for n=5 is: 
>>120 

+5

И все же вы вообще не ответили на вопрос ... или решили проблему. –

+0

@EddoHintoso О чем ты говоришь? Что-то не так в коде? – user2719152

+0

@ пользователь2719152: пункт -, думаю. что ваш ответ не отвечает на вопрос. Ваш ответ является рекурсивной реализацией факториальной функции, однако OP запросил обратную факториальную функцию (вид), т. Е. Дал некоторое число, что это 'n' в' factorial (n) ', который его производит. – mhawke

Смежные вопросы