第23、24讲第0题使用递归编写一个十进制转换为二进制的函数
def Dec2Bin(dec):result = ''
if dec:
result = Dec2Bin(dec//2)
return result + str(dec%2)
else:
return result
print(Dec2Bin(62))
这个题目不太理解,为什么str(dec%2)可以直接加到result里?变为二进制是从下到上取数,这上面也没看出哪里改了顺序?
程序改成
def Dec2Bin(dec):
result = ''
if dec:
result1 = Dec2Bin(dec//2)
return result1 + str(dec%2)
else:
return result
print(Dec2Bin(7))
也是对的,这两个result不是一个意思么? 只要理解一点:
当函数执行到递归的时候会暂停其后面的所有代码,等到递归返回的时候才继续执行其下面的代码 BngThea 发表于 2018-3-16 13:48
只要理解一点:
当函数执行到递归的时候会暂停其后面的所有代码,等到递归返回的时候才继续执行其下面的代 ...
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都会执行一次么?那不是每次都赋值空字符串么? 小咪的旅途 发表于 2018-3-16 14:39
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都 ...
result只是当循环除后商小于2时返回的,小于2时直接把余数放到末尾就行了,空字符串就是怕加上了啥啊。。真正的结果保存在result1里。你可以自己举个数字按程序一步步执行就能理解了 小咪的旅途 发表于 2018-3-16 14:39
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都 ...
是直接进入递归的,返回的时候接着执行下面的return
返回的时候就将修改后的result拼接起来了 Chase_Kas 发表于 2018-3-16 15:10
result只是当循环除后商小于2时返回的,小于2时直接把余数放到末尾就行了,空字符串就是怕加上了啥啊。。 ...
那顺序呢?62转二进制,余数出来的顺序是 0,1,1,1,1,1 为什么结果可以显示111110? #举个例子比较好说明递归的运行方式。
#假设n=3,执行else语句
1.result = Dec2Bin(3//2) #这里并不是向下执行,而是原地调用函数
2.result = Dec2Bin(1//2) #继续原地调用
3.result = Dec2Bin(0//2) n=0 返回result=''
3.return result + str(dec%2)#这里的列表返回到2,进行操作,然后由2返回到1
2.return result + str(dec%2)
1.return result + str(dec%2)
{:5_91:} 自己实际走一遍有助于加深理解哦 吴阿汤 发表于 2018-3-16 20:59
自己实际走一遍有助于加深理解哦
dec = 0后直接到 else 里return result? 然后再到if 里 return (调用Dec2Bin的次数) result +str(dec%2)?
这个顺序好奇怪。。。。不是应该原地调用到dec=0后直接else后return然后结束么? 小咪的旅途 发表于 2018-3-17 14:27
dec = 0后直接到 else 里return result? 然后再到if 里 return (调用Dec2Bin的次数) result +str(dec%2) ...
递归的话分为两个部分一个是递推,一个是回推。特点是1.调用自身函数,2.有一个明确的返回值。
当递推到一定深度,符合了返回的条件,return 一个值,然后返回到上层去执行。 吴阿汤 发表于 2018-3-17 14:41
递归的话分为两个部分一个是递推,一个是回推。特点是1.调用自身函数,2.有一个明确的返回值。
当递推 ...
原来是这样啊{:5_100:}想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~ 小咪的旅途 发表于 2018-3-17 14:44
原来是这样啊想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~
明白就好啦,建议其他时间看一下计算机方面的书吧,
语言只是一部分,了解底部逻辑亦有必要的{:5_106:}
小咪的旅途 发表于 2018-3-16 16:24
那顺序呢?62转二进制,余数出来的顺序是 0,1,1,1,1,1 为什么结果可以显示111110?
吴阿汤 发表于 2018-3-16 20:59
自己实际走一遍有助于加深理解哦
请问你=您举的例子这里 3.return result + str(dec%2)#这里的列表返回到2,进行操作,然后由2返回到1
这里的dec=3吗?然后打印出来的结果是011,然后0在前面不用显示就变成了11?新人有点不明白,还请指点一二 def Dec2Bin(dec):
result = ''
if dec: #如果dec不等于0
result = Dec2Bin(dec//2)
return result + str(dec%2)
'''
result + str(dec%2)=Dec2Bin(62//2) + str(62%2)
=Dec2Bin(31) + str(62%2)
=Dec2Bin(31//2) +str(31%2) + str(62%2)
=Dec2Bin(15) +str(31%2) + str(62%2)
=Dec2Bin(15//2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(7) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(7//2) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(3) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(3//2) + str(3%2) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(1) + str(3%2) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(1//2)+ str(1%2) + str(3%2) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
=Dec2Bin(0)+ str(1%2) + str(3%2) + str(7%2) + str(15%2) +str(31%2) + str(62%2)
='' +'1'+'1'+'1'+'1'+'1'+'0'
='111110'
'''
else:
return result
print(Dec2Bin(62))
页:
[1]