简体   繁体   English

如何从递归 function 中获取数字列表并将其作为列表返回?

[英]How to take list of numbers from a recursive function and return it as a list?

I made a recursive function that gives me a certain number if it's odd or even.我做了一个递归 function 如果它是奇数或偶数,它会给我一个特定的数字。 So, if I call the function with a 5 , it'll output 5, 16, 8, 4, 2, 1 .所以,如果我用5调用 function ,它将是 output 5, 16, 8, 4, 2, 1 How do I have the output return this sequence of numbers as a list?如何让 output 将此数字序列作为列表返回? So, [5, 16, 8, 4, 2, 1] .所以, [5, 16, 8, 4, 2, 1]

This is my code:这是我的代码:

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

There are two ways to do this.有两种方法可以做到这一点。

First, return a variable of list type and receive the return value and appending it.首先,返回一个列表类型的变量并接收返回值并附加它。 But this method has a large overhead但是这种方法开销很大

Second, make variable ls to global variable of list type and instead of returning a value, attach it to the ls variable.其次,将变量 ls 设置为列表类型的全局变量,而不是返回值,而是将其附加到 ls 变量。

Try to return a list of the printed variables and recursively append them.尝试返回打印变量的列表并递归 append 它们。

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

output output

5
16
8
4
2
1
[5, 16, 8, 4, 2, 1]
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)

The task can be done by defining a list globally.该任务可以通过全局定义一个列表来完成。

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

You could convert you recursive function into a generator and make a list of the output only when needed.您可以将递归 function 转换为生成器,并仅在需要时列出 output。

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]

To return a list directly, you don't need an intermediate variable:要直接返回列表,您不需要中间变量:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM