用python实现递归函数

2024-06-17 11:17:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一道家庭作业题。我试图得到一个递归函数:

def problem_a(n):
    answer.append(n)
    if n == 1:
        return answer    
    elif n % 2 == 0:
        answer.append(n/2)
    else :
        answer.append(n*3 + 1)
        problem_a(n*3 + 1)

这段代码显然不起作用,因为answer没有定义为列表。对于循环它可以工作,但是我想做一个递归函数。我可以用一个列表作为输入,但我想知道是否还有更优雅的东西。你知道吗

{}输出为

[7, 22, 11, 34, 17, 52, 26, 13, 40 , 20, 10 ,5 ,16, 8, 4, 2, 1]

Tags: 代码answer列表returnif定义def家庭
3条回答

到目前为止所建议的解决方案(使用额外的参数将列表传递到递归链上)的另一种解决方案是在从递归返回时构建最终列表。这不是非常有效,因为串联列表需要同时复制这两个列表,但它可以工作:

def problem_a(n):
    if n == 1:
        return [n]
    elif n % 2 == 0:
        return [n] + problem_a(n // 2)
    else:
        return [n] + problem_a(3*n + 1)

你可以试试发电机:

def problem_a(n):
    yield n
    if n == 1:
        return
    elif n % 2 == 0:
        x = n / 2
    else:
        x = n * 3 + 1

    for y in problem_a(x):
        yield y

print list(problem_a(7))

您可以定义一个局部变量answer,并在递归调用中传递它。你知道吗

def problem_a(n, answer = None):
    answer = [n] if answer is None else answer
    if n == 1:
        return answer
    elif n % 2 == 0:
        n = n/2
        answer.append(n)
    else:
        n = n*3 + 1
        answer.append(n)
    return problem_a(n, answer)

print problem_a(7)        

输出:

[7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

相关问题 更多 >