【问题标题】:Recursive Python Function Factorial递归 Python 函数阶乘
【发布时间】:2015-04-16 00:34:18
【问题描述】:

编写一个名为odd_factorial(x) 的递归Python 函数,如果x 是奇数,则输入x (x >= 5) 计算3 × 5 × 7 × . . . × x;或3 × 5 × . . . × (x − 1) 如果x 是偶数。

我有递归,但我不太确定如何确保x >= 5 用于第一个循环:

def odd_factorial(x):
    if x%2 == 1:
        if x == 3:
            return 3
        else:
            return x*odd_factorial(x-2)
    else:
        x -= 1
        if x == 3:
            return 3
        else:
            return x*odd_factorial(x-2)

【问题讨论】:

  • 就我个人而言,我会通过拥有两个功能来保持简单。第一个是非递归入口点,它将偶数转换为x-1 并检查输入是否为>=5。然后它调用第二个函数,即递归函数,它是您已有函数的更简单、更简洁的版本。
  • 你确定条件 x>=5 吗?
  • 如果x<5,函数应该返回什么?退出条件是什么?
  • 记得采纳对你最有帮助的答案!

标签: python function recursion factorial


【解决方案1】:

这将更快更干净,因为它不会在实际递归中进行调节。它仍然是一个函数,尽管嵌套了另一个函数。

def odd_factorial(x):
    def do_fact(x):
        if x == 3:
            return 3

        return x * do_fact(x - 2)

    if x < 5:
        raise ValueError("X must be at least 5")

    if not x % 2:
        x -= 1

    return do_fact(x)

跑步:

>>> odd_factorial(5)
15
>>> odd_factorial(6)
15
>>> odd_factorial(7)
105
>>> odd_factorial(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 9, in odd_factorial
    raise ValueError("X must be at least 5")
ValueError: X must be at least 5
>>> odd_factorial(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 9, in odd_factorial
    raise ValueError("X must be at least 5")
ValueError: X must be at least 5

另一种方法是直接为odd_factorial(5)odd_factorial(6)返回15

def odd_factorial(x):
    if x < 5:
        raise ValueError("x must be at least 5")
    if x % 2 == 0:
        x -= 1     
    if x == 5:
        return 15
    return x * odd_factorial(x - 2)

【讨论】:

    【解决方案2】:

    使用inner 函数,为您节省一个额外的参数:

    >>> def odd_factorial(input):
         def odd_factorial_inner(x):
             if x%2 == 1:
                 if x == 3:
                     return 3
                 else:
                     return x*odd_factorial_inner(x-2)
             else:
                 x -= 1
                 if x == 3:
                     return 3
                 else:
                     return x*odd_factorial_inner(x-2)
         if (input >= 5):
             return odd_factorial_inner(input)
         else:
             print "input is smaller than 5"
    
    >>> odd_factorial(9)
    945
    >>> odd_factorial(4)
    Input is smaller than 5.
    

    【讨论】:

      【解决方案3】:

      为什么不简单地改变它的计算方式:

      def odd_factorial(x):
          if x%2 == 0:
              x -= 1
          if x == 5:
              return 3*5
          elif x < 5:
              raise ValueError("Input should not be < 5")
          else:
              return x*odd_factorial(x-2)
      

      这很好,因为您不会像以前那样重复自己(使用偶数/奇数检查)并且您仍然遵循规范!

      【讨论】:

        【解决方案4】:

        添加一个额外的检查设置一个标志,以便您捕获输入的值

        def odd_factorial(x, flag=True):
            if x < 5 and  flag:
                return "Only numbers >= 5"
            if x % 2: # or if x & 1
                return x * odd_factorial(x - 2, False) if x != 3 else 3
            x -= 1
            return x * odd_factorial(x - 2, False)
        
        In [32]: odd_factorial(5)
        Out[32]: 15
        
        In [33]: odd_factorial(3)
        Out[33]: 'Only numbers >= 5'
        
        In [34]: odd_factorial(7)
        Out[34]: 105
        

        【讨论】:

          【解决方案5】:

          简单复杂:)

          def odd_factorial(x, signal=None):
              if x < 5 and signal==None:
                  return "number should be greater than 5"
              else:
                  if x%2 == 1:
                      if x == 3:
                          return 3
                      else:
                          return x*odd_factorial(x-2, signal="r")
                  else:
                      x -= 1
                      if x == 3:
                          return 3
                      else:
                          return x*odd_factorial(x-2, signal="r")
          

          【讨论】:

          • 这行不通!初始条件阻止函数继续执行!
          【解决方案6】:

          这是一个仅使用奇数的非常简单的递归阶乘程序

          #Factorial using Recursion
          n = int(input("Enter the n value for Factorial:"))
          def factorial(n):
          if n<=1:
              return 1
          else:
              return n*factorial(n-2)
          
          print(factorial(n))
          

          【讨论】:

            猜你喜欢
            • 2017-05-07
            • 1970-01-01
            • 2019-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-01
            • 2015-01-08
            • 1970-01-01
            相关资源
            最近更新 更多