|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 niuniuniu666 于 2021-10-13 08:54 编辑
以下两个递归代码:
1:十进制转换成二进制,如second(22) = 0b10110
- def second(n):
- str1 = ''
- if n:
- str1 = second(n // 2)
- str1 = str1 + str(n%2)
- return str1
- n = int(input('請輸入需要轉化的數字:'))
- print('0b',second(n),sep='')
复制代码 2:将输入的数字每个数位分解到列表中,如get_digits(13245) = [1,2,3,4,5]
- list1 = []
- def get_digits(n):
- if n:
- list1.insert(0,n%10)
- get_digits(n//10)
- return list1
- n = int(input('請輸入需要轉化的數字:'))
- print(get_digits(n))
复制代码 问题:
为什么1中要在函数内定义str1不能在外部定义str1已弄懂,能不能在外部定义str1? 已弄懂
为什么2中要在函数外定义list1不能在内部定义list1已弄懂,能不能在内部定义list1?已弄懂
对比两个代码,为什么会出现这种一个在内部定义一个在外部定义的情况,是因为字符串和列表的特性吗?这个问题不知道算不算钻牛角尖了
本帖最后由 qaoapp 于 2021-10-11 22:38 编辑
当你在函数体内定义str1 = second(n // 2)时, 函数内部有了这个名字, 就不会再去全局名称空间找, 但是你的if语句导致递归回溯return的时候没执行到str1的赋值语句, 会提示变量未定义;
为什么不能在函数内定义list1, 因为后续的每一次递推都会创建一个属于自己的空list1, 整个递归过程都是各玩各的, 每次执行的list1都不相关
怎么在函数内定义list1 = [], 可以使用闭包
- def outer():
- list1 = []
- def get_digits(n):
- if n:
- list1.insert(0,n%10)
- get_digits(n//10)
- return list1
- return get_digits
- get_digits = outer()
- n = int(input('請輸入需要轉化的數字:'))
- print(get_digits(n))
复制代码
|
|