鱼C论坛

 找回密码
 立即注册
查看: 5070|回复: 13

[已解决]第23、24讲第0题使用递归编写一个十进制转换为二进制的函数

[复制链接]
发表于 2018-3-16 13:43:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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不是一个意思么?
最佳答案
2018-3-16 20:59:39
  1. #举个例子比较好说明递归的运行方式。
  2. #假设n=3,执行else语句

  3. 1.result = Dec2Bin(3//2)       #这里并不是向下执行,而是原地调用函数

  4.     2.result = Dec2Bin(1//2)   #继续原地调用
  5.    
  6.              3.result = Dec2Bin(0//2)       n=0 返回result=''
  7.              3.return result + str(dec%2)#  这里的列表返回到2,进行操作,然后由2返回到1
  8.    
  9.     2.return result + str(dec%2)

  10. 1.return result + str(dec%2)
复制代码

自己实际走一遍有助于加深理解哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-16 13:48:12 | 显示全部楼层
只要理解一点:
当函数执行到递归的时候会暂停其后面的所有代码,等到递归返回的时候才继续执行其下面的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都会执行一次么?那不是每次都赋值空字符串么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 15:10:58 From FishC Mobile | 显示全部楼层
小咪的旅途 发表于 2018-3-16 14:39
if里的第一个语句就是递归,难道就直接递归,不执行if的第二句return么?
还有 result = ' ' 每次递归都 ...

result只是当循环除后商小于2时返回的,小于2时直接把余数放到末尾就行了,空字符串就是怕加上了啥啊。。真正的结果保存在result1里。你可以自己举个数字按程序一步步执行就能理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是直接进入递归的,返回的时候接着执行下面的return
返回的时候就将修改后的result拼接起来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那顺序呢?62转二进制,余数出来的顺序是 0,1,1,1,1,1 为什么结果可以显示111110?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 20:59:39 | 显示全部楼层    本楼为最佳答案   
  1. #举个例子比较好说明递归的运行方式。
  2. #假设n=3,执行else语句

  3. 1.result = Dec2Bin(3//2)       #这里并不是向下执行,而是原地调用函数

  4.     2.result = Dec2Bin(1//2)   #继续原地调用
  5.    
  6.              3.result = Dec2Bin(0//2)       n=0 返回result=''
  7.              3.return result + str(dec%2)#  这里的列表返回到2,进行操作,然后由2返回到1
  8.    
  9.     2.return result + str(dec%2)

  10. 1.return result + str(dec%2)
复制代码

自己实际走一遍有助于加深理解哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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然后结束么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 一个值,然后返回到上层去执行。
python.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

原来是这样啊想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-17 16:11:39 | 显示全部楼层
小咪的旅途 发表于 2018-3-17 14:44
原来是这样啊想起视频确实讲过的哈哈,终于懂啦,谢谢你奥~

明白就好啦,建议其他时间看一下计算机方面的书吧,
语言只是一部分,了解底部逻辑亦有必要的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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?新人有点不明白,还请指点一二
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 14:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表