【问题标题】:recursive factorial function递归阶乘函数
【发布时间】:2010-12-21 18:06:19
【问题描述】:

我怎样才能将这两个函数组合成一个递归函数来得到这个结果:

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

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

【问题讨论】:

  • 我没有任何理由将两者合二为一。
  • 嗯。这是作业吗?到目前为止,您尝试过什么?
  • 不要。它看起来很好。将它们结合起来只会让事情变得更加困难。
  • @FrustratedWithFormsDesigner:去年的考试……哈哈……我希望我能带你们一起为我写我的考试,但这是不可能的:P
  • 提问者可能在问题设置后已经毕业。无论如何,我希望希望他们实现 factorial recursive 的老师告诉他们,递归解决方案的效率太糟糕了,绝对不应该被允许。 :)

标签: python recursion factorial


【解决方案1】:

我们可以将这两个函数组合成一个递归函数:

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】:

    2行代码:

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

    测试一下:

    print fac(4)
    

    结果:

    24
    

    【讨论】:

      【解决方案3】:
      def factorial(n):
          result = 1 if n <= 1 else n * factorial(n - 1)
          print '%d! = %d' % (n, result)
          return result
      

      【讨论】:

        【解决方案4】:

        一个简短的:

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

        【讨论】:

          【解决方案5】:

          试试这个:

          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

          【讨论】:

            【解决方案6】:

            我没有使用 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
            

            【讨论】:

            • 我不是 100% 确定这是正确的,但由于 OP 说这是为了考试,我不会再详细说明...
            【解决方案7】:

            这是作业吗?

            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:这是非常低效的解决方案,因为您计算阶乘(1)n 次、阶乘(2)n-1 次、阶乘(3)n-2 次等等在...
            【解决方案8】:
            fac = lambda x: 1 if x == 0 else x * fac(x - 1)
            

            【讨论】:

              【解决方案9】:

              还有一个

              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))
              

              【讨论】:

              • 数学上 0!计算结果为 1。所以你的条件的第一部分应该改变。
              【解决方案10】:

              第一次使用递归和 while 循环计算阶乘。

              def factorial(n):
                  while  n >= 1:
                      return n * factorial(n - 1)
                  return 1
              

              虽然TrebledJ 在 cmets 中写的关于使用if 的选项更好。因为while 循环执行的操作(SETUP_LOOP, POP_BLOCK)比if 多。该功能较慢。

              def factorial(n):
                  if  n >= 1:
                      return n * factorial(n - 1)
                  return 1
              

              timeit -n 10000 -r 10

              • while 836 µs ± 11.8 µs 每个循环
              • if 787 µs ± 7.22 µs 每个循环

              【讨论】:

              • 虽然正确,但while 是多余的,因为return 将在第一次迭代时启动(并且不会执行其他迭代)。将while 更改为if 会好很多。
              • 我所说的冗余是指交流方面......其他看到该功能的编码人员会看到while并认为:“好吧,它是循环的阶乘”;然后一行之后他们看到return 并意识到它实际上是递归的阶乘。 (通常,递归是循环的替代品。)而且......啊,我看到了一个基准。 while 和 if 之间的性能差异很小,但您的新内容似乎已经过充分研究。 :-)
              【解决方案11】:

              可以使用这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)))
              

              【讨论】:

              • 这不起作用。对factorial() 的第二个引用应改为f()
              【解决方案12】:

              我真的不知道负数的阶乘,但这适用于所有 n >= 0:

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

              【讨论】:

                【解决方案13】:

                在递归函数中总是存在某种循环和一些停止循环的停止代码:

                public int recursivefactorial(int number)
                {
                    if(number==1)
                        return 1;
                    else
                        return recursivefactorial(number-1)*number;
                }
                

                正如您所见,满足if 条件会导致代码实际结束“循环”,这是递归函数中最重要的部分。相反,条件的else 部分导致再次调用recursivefactorial 函数,这实际上是一种循环。

                【讨论】:

                  【解决方案14】:

                  还有一个 =)

                  #FAC calculation
                  
                  def fakulteta(x):
                      if x!=1:
                           return x*fakulteta(x-1)
                      return 1
                  
                  
                  print (fakulteta(12))
                  

                  【讨论】:

                  • 不处理0及以下会出现递归错误
                  猜你喜欢
                  • 2019-08-06
                  • 2015-04-16
                  • 1970-01-01
                  • 2017-05-07
                  • 2012-04-01
                  • 2015-01-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多