2010-12-21 4 views
8

как я могу объединить эти две функции для одной рекурсивной функции, чтобы иметь этот результат:рекурсивная функция вычисления факториала

factorial(6) 
1! = 1 
2! = 2 
3! = 6 
4! = 24 
5! = 120 
6! = 720 

эти коды

def factorial(n): 
    if n <1: # base case 
     return 1 
    else: 
     return n * factorial(n - 1) # recursive call 
def fact(n): 
     for i in range(1, n+1): 
       print "%2d! = %d" % (i, factorial(i)) 

fact(6) 
1! = 1 
2! = 2 
3! = 6 
4! = 24 
5! = 120 
6! = 720 

как вы видите исполнение этих двух дает правильный ответ, я просто хочу сделать это с помощью одной рекурсивной функции.

+4

я не получаю никаких причин, чтобы объединить обе в одну функцию. – mqpasta

+1

Хм. Это домашнее задание? что ты уже испробовал? –

+0

Не надо. Это выглядит так, как есть. Сочетание их просто усложнит ситуацию. – FrustratedWithFormsDesigner

ответ

19
def factorial(n): 
    if n <1: # base case 
     return 1 
    else: 
     returnNumber = n * factorial(n - 1) # recursive call 
     print(str(n) + '! = ' + str(returnNumber)) 
     return returnNumber 
2

У меня нет опыта работы с Python, но что-то вроде этого?

def factorial(n): 
    if n <1: # base case 
     return 1 
    else: 
     f = n * factorial(n - 1) # recursive call 
     print "%2d! = %d" % (n, f) 
     return f 
+0

Я не уверен на 100%, что это правильно, но так как ОП сказал, что для экзамена я больше не буду вдаваться в подробности ... – FrustratedWithFormsDesigner

2

попробовать это:

def factorial(n): 
    if n <1: # base case 
     print "%2d! = %d" % (n, n) 
     return 1 
    else: 
     temp = factorial(n - 1) 
     print "%2d! = %d" % (n, n*temp) 
     return n * temp # recursive call 

Одна вещь, которую я заметил, что вы возвращаете «1» для п < 1, это означает, что ваша функция будет возвращать 1, даже для отрицательных чисел. Вы можете это исправить.

4
def factorial(n): 
    result = 1 if n <= 1 else n * factorial(n - 1) 
    print '%d! = %d' % (n, result) 
    return result 
1

Является ли это домашнее задание, случайно?

def traced_factorial(n): 
    def factorial(n): 
    if n <= 1: 
     return 1 
    return n * factorial(n - 1) 
    for i in range(1, n + 1): 
    print '%2d! = %d' %(i, factorial(i)) 

Дания PEP227 a читать для более подробной информации. Короче говоря, Python позволяет вам определять функции внутри функций.

+0

lol ... это был один из хороших;) – user531225

+0

@D.Shawley: Это довольно неэффективное решение, так как вы вычисляете factorial (1) 'n' раз, factorial (2)' n-1' раз, factorial (3) 'n-2' раз и так далее ... – Tadeck

1

Еще один

def fact(x): 
    if x == 0: 
     return 0 
    elif x == 1: 
     return 1 
    else: 
     return x * fact(x-1) 

for x in range(0,10): 
    print '%d! = %d' %(x, fact(x)) 
+0

Математически 0 ! оценивается в 1. Таким образом, первая часть вашего условного обозначения должна быть изменена. – mcocdawc

5

коротким:

def fac(n): 
    if n == 0: 
     return 1 
    else: 
     return n * fac(n-1) 
print fac(0) 
18

2 строки кода:

def fac(n): 
    return 1 if (n < 1) else n * fac(n-1) 

Попробуй:

print fac(4) 

Результат:

24 
1
fac = lambda x: 1 if x == 0 else x * fac(x - 1) 
0

Если вы хотели бы получить информацию от пользователя!

def factorial(number): 
    return 1 if (number<1) else number * factorial(number-1) 

n = int(input().strip()) 

print("n! = 1", end="") 

for num in range(2, n+1): 
    print(" x {}". format(num), end="") 


print(" = {}".format(factorial(n))) 
0

Я не знаю, факториал отрицательных чисел, но это будет работать со всеми п> = 0:

def factorial(n): 
if n >= 0: 
    if n == 1 or n==0: 
     return 1 
    else: 
     n = n * factorial(n-1) 
     return n 
else: 
    return 'error' 
Смежные вопросы