为了账号安全,请及时绑定邮箱和手机立即绑定

在python中制作递归函数

在python中制作递归函数

慕哥9229398 2021-03-30 13:11:07
这是一个作业问题。我尝试获得一个递归函数: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]
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

到目前为止,已经提出的方法(使用额外的参数将列表传递到递归链中)的一种替代解决方案是在您从递归返回时构建最终列表。这并不是非常有效,因为连接列表需要同时复制它们,但是它可以工作:


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)



查看完整回答
反对 回复 2021-04-02
?
四季花海

TA贡献1811条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-04-02
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以尝试使用发电机:


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


查看完整回答
反对 回复 2021-04-02
  • 3 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信