递归阶乘函数

11

我怎样才能将这两个函数合并成一个递归函数,以获得这个结果:

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

如您所见,这两个函数的执行给出了正确的答案,但我只想将这两个函数简化为一个递归函数。


7
我不明白将两个功能合并为一个的原因。 - mqpasta
1
嗯,这是作业吗?你已经尝试过什么了吗? - Jason Orendorff
1
不要这样做,现在看起来很好。将它们结合会使事情变得更加困难。 - FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner:去年的考试...哈哈...我希望我能带着你们为我写考试,但这是不可能的 :P - user531225
问问题的人可能已经毕业了,因为问题是在很久以前提出的。无论如何,我希望要求他们递归实现阶乘的老师告诉他们,递归解决方案的效率非常低劣,不应该被允许使用。 :) - pepr
15个回答

31
我们可以将这两个函数合并成单个递归函数:
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

27

2 行代码:

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

测试一下:

print fac(4)

结果:

24

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

5
一个简短的例子:
def fac(n):
    if n == 0:
        return 1
    else:
        return n * fac(n-1)
print fac(0)

4
我没有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

我不确定这是否正确,但既然OP说这是为了考试,我就不会再深入讨论了... - FrustratedWithFormsDesigner

4

试试这个:

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

我注意到你的函数在n<1时返回了'1',这意味着即使是负数,你的函数也会返回1。你可能需要修复这个问题。


3
这是一份作业吗?
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可以了解更多细节。简单来说,Python允许在函数内部定义函数。


@D.Shawley:这种解决方案非常低效,因为您要计算 n 次阶乘(factorial(1)),n-1 次阶乘(factorial(2)),n-2 次阶乘(factorial(3))等等... - Tadeck

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

1

再来一个

def fact(x):
    if x in {0, 1}:
        return 1
    else:
        return x * fact(x-1)

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

1
数学上,0!的值为1。因此,你条件语句的第一部分应该改变。 - mcocdawc

0

可以使用这4行代码...

   def factorial(n):
        f = lambda n: n * f(n - 1) if n > 1 else 1

        for x in range(n):
            print('{}! = {}'.format(x + 1, factorial(x + 1)))

2
这个不行。第二次引用 factorial() 应该改为 f() - cdlane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接