【问题标题】:Function is printing multiple times功能正在打印多次
【发布时间】:2016-06-12 03:12:05
【问题描述】:

我编写了一个函数,该函数将一个正整数 n 作为输入,并递归地返回一个阶乘值列表 1!, 2!, 。 . . ,嗯!。

但是,我无法让它仅打印一次列表。我尝试将打印语句放在各种循环/位置,它总是打印至少 3 次。我也尝试过打印该函数,但它返回“无”,如果我在函数中有打印语句,它似乎只会打印。为什么是这样?

这是我的代码:

def calc_Factorial(my_list, n, x, e):

    if not my_list:
        my_list.append(n-(n-1))
        calc_Factorial(my_list, n, x, e)
    else:
        if len(my_list) < n:
             my_list.append(my_list[e]*x)
             calc_Factorial(my_list, n, x+1, e+1)

    if len(my_list) == n:
        print(my_list)


e = 0
x = 2
n = int(input('Enter number: '))
my_list = []
calc_Factorial(my_list, n, x, e)

【问题讨论】:

  • my_list.append(n-(n-1)) :这不只是1吗?另外,为什么不直接使用 for 循环呢?我不知道你为什么需要一遍又一遍地重复这个函数。
  • 是的,它永远是 1,不知道为什么我这样写。这个想法是练习递归,而不仅仅是使用 for 循环,这就是它看起来很乱的原因。

标签: python function recursion


【解决方案1】:

该值被多次打印,因为您在递归函数中使用了print。您应该在递归函数中返回而不是打印。

def calc_Factorial(my_list, n, x, e):

  if not my_list:
    my_list.append(n-(n-1))
    return calc_Factorial(my_list, n, x, e)
  else:
    if len(my_list) < n:
         my_list.append(my_list[e]*x)
         return calc_Factorial(my_list, n, x+1, e+1)

    if len(my_list) == n:
        return (my_list)


e = 0
x = 2
n = int(input("Enter number: "))
my_list = []
print (calc_Factorial(my_list, n, x, e))

【讨论】:

    【解决方案2】:

    将打印语句改为return my_list:

    def calc_Factorial(my_list, n, x, e):
        if not my_list:
            my_list.append(n-(n-1))
            calc_Factorial(my_list, n, x, e)
        else:
            if len(my_list) < n:
                 my_list.append(my_list[e]*x)
                 calc_Factorial(my_list, n, x+1, e+1)
        if len(my_list) == n:
            return my_list
    
    
    >>> calc_Factorial(my_list, n, x, e)
    [1, 2, 6, 24, 120, 720, 5040]
    >>> 
    

    【讨论】:

      【解决方案3】:
      def calc_Factorial(my_list, n, x, e):
      
          if not my_list:
              my_list.append(n-(n-1))
              return calc_Factorial(my_list, n, x, e)
          else:
              if len(my_list) < n:
                   my_list.append(my_list[e]*x)
                   return calc_Factorial(my_list, n, x+1, e+1)
      
          if len(my_list) == n:
              print(my_list)
              return my_list
      

      您的关键问题是每次拨打recursive 时都应该return calc_Factorial(my_list, n, x+1, e+1)。如果您不return 进行递归,则其余代码最终将被执行。这就是为什么你看到多个print

      在这种情况下,只要您使用 return 调用递归。你应该总是只看到一次打印(即使你没有看到return my_list:

      if len(my_list) == n:
          print(my_list)
      

      但通常在递归函数中,人们最终只是返回你想要的值。但是,您可以使用 print 来进行调试。

      【讨论】:

        【解决方案4】:

        您所看到的是因为这部分:

        if len(my_list) < n:
             my_list.append(my_list[e]*x)
             calc_Factorial(my_list, n, x+1, e+1) 
        
        
        if len(my_list) == n:
            print(my_list)
        

        在第一个if语句之后,函数会继续执行,现在 n == len(my_list) 所以列表将被打印。 (实际上这意味着对函数的每次调用最终都会打印一些东西)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-21
          • 2021-07-13
          • 1970-01-01
          • 2018-07-10
          • 1970-01-01
          • 2014-11-29
          • 2022-01-01
          相关资源
          最近更新 更多