【问题标题】:How to take list of numbers from a recursive function and return it as a list?如何从递归函数中获取数字列表并将其作为列表返回?
【发布时间】:2020-12-03 03:48:53
【问题描述】:

我做了一个递归函数,如果它是奇数或偶数,它会给我一个特定的数字。因此,如果我使用5 调用该函数,它将输出5, 16, 8, 4, 2, 1。如何让输出将此数字序列作为列表返回?所以,[5, 16, 8, 4, 2, 1]

这是我的代码:

def recursion_list(number):
    ls = []
    print(number)
    if number == 1:
        return 1
    if number % 2 == 0:
        first = recursion_list(number // 2)
        return first
    elif number % 2 == 1:
        second = recursion_list(3 * number + 1)
        return second

【问题讨论】:

    标签: python list recursion


    【解决方案1】:

    有两种方法可以做到这一点。

    首先,返回一个列表类型的变量,并接收返回值并附加它。 但是这种方法开销很大

    其次,将变量 ls 变为列表类型的全局变量,而不是返回值,而是将其附加到 ls 变量。

    【讨论】:

      【解决方案2】:

      尝试返回打印变量的列表并递归附加它们。

      def recursion_list(number):
          ls = [number]
          print(number)
          if number == 1:
              return ls
          if number % 2 == 0:
              ls += recursion_list(number // 2)
              return ls
          elif number % 2 == 1:
              ls += recursion_list(3 * number + 1)
              return ls
      print(recursion_list(5))
      

      输出

      5
      16
      8
      4
      2
      1
      [5, 16, 8, 4, 2, 1]
      

      【讨论】:

        【解决方案3】:

        这个任务可以通过全局定义一个列表来完成。

        ls = []
        def recursion_list(number):
            ls.append(number)
            if number == 1:
                return ls
            if number % 2 == 0:
                first = recursion_list(number // 2)
                return first
            elif number % 2 == 1:
                second = recursion_list(3 * number + 1)
                return second
        
        print(recursion_list(5))
        

        【讨论】:

          【解决方案4】:
          def recursion_list(number):
             ls = [number]
             if number == 1:
                return ls
             elif number % 2 == 0:
                return ls + recursion_list(number // 2)
             elif number % 2 == 1:
                return ls + recursion_list(3 * number + 1)
          

          【讨论】:

            【解决方案5】:

            您可以将递归函数转换为生成器,并仅在需要时列出输出。

            def recursion_gen(number):
                yield number
                if number == 1: return
                if number % 2 == 0:
                    for n in recursion_gen(number // 2):
                        yield n
                else:
                    for n in recursion_gen(3 * number + 1):
                        yield n
            
            print(*recursion_gen(5)) # 5 16 8 4 2 1
            
            ls = list(recursion_gen(5))
            print(ls) # [5, 16, 8, 4, 2, 1]
            

            直接返回列表,不需要中间变量:

            def recursion_list(number):
                if number == 1:
                    return [number]
                if number % 2 == 0:
                    return [number] + recursion_list(number // 2)
                else:
                    return [number] + recursion_list(3 * number + 1)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-18
              • 2021-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多