在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未定义为列表。使用循环可以正常工作,但是我想创建一个递归函数。我可以只使用一个列表作为输入,但是我想知道是否存在更优雅的东西。


problem_a(7) 应该给出作为输出:


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


慕哥9229398
浏览 220回答 3
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)

四季花海

您可以定义局部变量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]

胡说叔叔

您可以尝试使用发电机: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 yprint list(problem_a(7))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python