python递归中的全局变量

文章讨论了递归函数在Python中的工作原理,强调了栈的先进后出特性。递归中可以使用可迭代变量如list作为全局变量,而不可迭代变量需通过参数传递。文中通过示例代码展示了递归过程中全局变量sum_的变化,说明了可迭代变量传入的是引用,不可迭代变量传入的是形参,导致两者在递归中的行为差异。同时指出在递归函数中使用`global`声明全局变量会导致错误,因为每次递归都会创建新的局部变量。
摘要由CSDN通过智能技术生成

 1.递归是栈结构,即先进后出,从以下代码打印的结果可以看出;

 2.递归中可以使用可迭代变量(如list)作为全局变量,如代码中的path;

 3.递归中不能使用不可迭代变量作为全局变量,要实现全局变量只能传参进去,如代码中的sum_,想要让sum_返回出来,可以通过代码中的形式,在backtrack的结束条件中return全局变量sum_,在出栈的时候进行赋值并再次return; 

 4.会造成2、3的差别是因为python中可迭代变量传入的是引用,不可迭代变量传入的是形参;

def calcNum(n):
    def backtrack(n, sum_):
        if (n > 5):
            return sum_ # !!! return 1
        path.append(n)
        sum_ += n
        n+=1
        print('进栈的n:', n)
        print('进栈的sum_:', sum_)
        sum_ = backtrack(n, sum_) # !!! return 2
        print('出栈的n:', n)
        print('出栈的sum_:', sum_)
        return sum_ # !!! return 3

    sum_ = 0
    path = []
    ret = backtrack(n, sum_)
    print('path:',path)
    print('ret:',ret)
    return ret

print(calcNum(0))

# 进栈的n: 1
# 进栈的sum_: 0
# 进栈的n: 2
# 进栈的sum_: 1
# 进栈的n: 3
# 进栈的sum_: 3
# 进栈的n: 4
# 进栈的sum_: 6
# 进栈的n: 5
# 进栈的sum_: 10
# 进栈的n: 6
# 进栈的sum_: 15
# 出栈的n: 6
# 出栈的sum_: 15
# 出栈的n: 5
# 出栈的sum_: 15
# 出栈的n: 4
# 出栈的sum_: 15
# 出栈的n: 3
# 出栈的sum_: 15
# 出栈的n: 2
# 出栈的sum_: 15
# 出栈的n: 1
# 出栈的sum_: 15
# path: [0, 1, 2, 3, 4, 5]
# ret: 15
# 15

在递归函数中使用global声明全局变量没有效果,会报错说变量没定义,如代码中的sum_:

def calcNum(n):
    def backtrack(n):
        global sum_
        if (n > 5):
            return sum_
        path.append(n)
        sum_ += n
        n+=1
        print('进栈的n:', n)
        print('进栈的sum_:', sum_)
        sum_ = backtrack(n)
        print('出栈的n:', n)
        print('出栈的sum_:', sum_)
        return sum_

    sum_ = 0
    path = []
    ret = backtrack(n)
    print('path:',path)
    print('ret:',ret)
    return ret

print(calcNum(0))

# error: sum_未定义

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值