小咪的旅途 发表于 2018-3-16 13:43:21

第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:12

只要理解一点:
当函数执行到递归的时候会暂停其后面的所有代码,等到递归返回的时候才继续执行其下面的代码

小咪的旅途 发表于 2018-3-16 14:39:20

BngThea 发表于 2018-3-16 13:48
只要理解一点:
当函数执行到递归的时候会暂停其后面的所有代码,等到递归返回的时候才继续执行其下面的代 ...

if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都会执行一次么?那不是每次都赋值空字符串么?

Chase_Kas 发表于 2018-3-16 15:10:58

小咪的旅途 发表于 2018-3-16 14:39
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都 ...

result只是当循环除后商小于2时返回的,小于2时直接把余数放到末尾就行了,空字符串就是怕加上了啥啊。。真正的结果保存在result1里。你可以自己举个数字按程序一步步执行就能理解了

BngThea 发表于 2018-3-16 15:47:05

小咪的旅途 发表于 2018-3-16 14:39
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都 ...

是直接进入递归的,返回的时候接着执行下面的return
返回的时候就将修改后的result拼接起来了

小咪的旅途 发表于 2018-3-16 16:24:52

Chase_Kas 发表于 2018-3-16 15:10
result只是当循环除后商小于2时返回的,小于2时直接把余数放到末尾就行了,空字符串就是怕加上了啥啊。。 ...

那顺序呢?62转二进制,余数出来的顺序是 0,1,1,1,1,1 为什么结果可以显示111110?

吴阿汤 发表于 2018-3-16 20:59:39

#举个例子比较好说明递归的运行方式。
#假设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-17 14:27:11

吴阿汤 发表于 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:41:30

小咪的旅途 发表于 2018-3-17 14:27
dec = 0后直接到 else 里return result? 然后再到if 里 return (调用Dec2Bin的次数) result +str(dec%2) ...

递归的话分为两个部分一个是递推,一个是回推。特点是1.调用自身函数,2.有一个明确的返回值。
当递推到一定深度,符合了返回的条件,return 一个值,然后返回到上层去执行。

小咪的旅途 发表于 2018-3-17 14:44:56

吴阿汤 发表于 2018-3-17 14:41
递归的话分为两个部分一个是递推,一个是回推。特点是1.调用自身函数,2.有一个明确的返回值。
当递推 ...

原来是这样啊{:5_100:}想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~

吴阿汤 发表于 2018-3-17 16:11:39

小咪的旅途 发表于 2018-3-17 14:44
原来是这样啊想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~

明白就好啦,建议其他时间看一下计算机方面的书吧,
语言只是一部分,了解底部逻辑亦有必要的{:5_106:}

qq614704680 发表于 2020-1-19 09:44:54

小咪的旅途 发表于 2018-3-16 16:24
那顺序呢?62转二进制,余数出来的顺序是 0,1,1,1,1,1 为什么结果可以显示111110?

好好学不玩手机 发表于 2020-2-19 12:13:31

吴阿汤 发表于 2018-3-16 20:59
自己实际走一遍有助于加深理解哦

请问你=您举的例子这里 3.return result + str(dec%2)#这里的列表返回到2,进行操作,然后由2返回到1
这里的dec=3吗?然后打印出来的结果是011,然后0在前面不用显示就变成了11?新人有点不明白,还请指点一二

dingweiwei2 发表于 2021-2-5 17:07:34

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]
查看完整版本: 第23、24讲第0题使用递归编写一个十进制转换为二进制的函数