鱼C论坛

 找回密码
 立即注册
查看: 2985|回复: 9

[已解决]菜鸟来求助一下23课递归的作业

[复制链接]
发表于 2018-6-25 11:58:42 | 显示全部楼层 |阅读模式

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

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

x
def transec(x):
    str1=''
    if x:
        str1=transec(x//2)
        return str1+str(x%2)
    else:
        return str1
   
result=int(input('输入一个数:'))
print(transec(result))

这是小鱼老师的习题答案,10转2,好晕,想请大神帮一下,疑问主要有两点:1、if x,x=x//2是在怎么计算的,2、str1=transec(x//2),这句是给STR1赋了什么值?

感谢感谢
最佳答案
2018-6-25 16:27:10
本帖最后由 凌九霄 于 2018-6-25 16:42 编辑
  1. 递归开始(假设求10的二进制数)
  2. 1、transec(10)  x=10
  3. 2、str1 = transec(5)  x=5     str1 = ''
  4. 3、str1 = transec(2)  x=2     str1 = ''
  5. 4、str1 = transec(1)  x=1     str1 = ''
  6. 5、str1 = transec(0)  x=0 所以执行else下语句,   return ''          并退出transec(0)函数
  7. 6、执行transec(1) 函数下的return str1+str(1%2)  return '' + '1'    并退出transec(1)函数
  8. 7、执行transec(2) 函数下的return str1+str(2%2)  return '1' + '0'   并退出transec(2)函数
  9. 8、执行transec(5) 函数下的return str1+str(5%2)  return '10' + '1'  并退出transec(5)函数
  10. 9、执行transec(10)函数下的return str1+str(10%2) return '101' + '0' 并退出transec(10)函数
  11. 递归结束
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-25 12:18:15 | 显示全部楼层
本帖最后由 凌九霄 于 2018-6-25 13:22 编辑

1、这里的 if x 是 if x != 0的意思
2、这个str1的值要递归到最后一层完成后才能反向依次确定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 13:39:56 | 显示全部楼层
凌九霄 发表于 2018-6-25 12:18
1、这里的 if x 是 if x != 0的意思
2、这个str1的值要递归到最后一层完成后才能反向依次确定

感谢哈,
1、那个if x 的意思我是知道的,我想问的是x//2是在什么时候赋给x的?
2、str1要最后一层才会赋值,那 return str1+str(x%2)里的str1永远是空字符串吗?
还是应该理解为:因为return的关系,str1=str1+str(x%2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 13:51:28 | 显示全部楼层
我好像有点明白了,由于函数return的是str1+str(x%2),因此str1=tansec(x//2)就可以理解为str1=str1+str(x%2),不断调用直到循环失败,而由于是栈存储,所以str1的自加和x//2都会不断的迭代,所以程序才能成功。
不知道理解的是否正确。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 14:25:46 | 显示全部楼层
我按理解去换了一下顺序,结果报错了。。。云里雾里。。。

def transec(x):
    str1=''
    if x:
        return str1+str(x%2)
        str1=transec(x//2)
     else:
        return str1


result=int(input('输入一个数:'))
print(transec(result))
  File "<tokenize>", line 6
    else:
    ^
IndentationError: unindent does not match any outer indentation level
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 16:27:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 2018-6-25 16:42 编辑
  1. 递归开始(假设求10的二进制数)
  2. 1、transec(10)  x=10
  3. 2、str1 = transec(5)  x=5     str1 = ''
  4. 3、str1 = transec(2)  x=2     str1 = ''
  5. 4、str1 = transec(1)  x=1     str1 = ''
  6. 5、str1 = transec(0)  x=0 所以执行else下语句,   return ''          并退出transec(0)函数
  7. 6、执行transec(1) 函数下的return str1+str(1%2)  return '' + '1'    并退出transec(1)函数
  8. 7、执行transec(2) 函数下的return str1+str(2%2)  return '1' + '0'   并退出transec(2)函数
  9. 8、执行transec(5) 函数下的return str1+str(5%2)  return '10' + '1'  并退出transec(5)函数
  10. 9、执行transec(10)函数下的return str1+str(10%2) return '101' + '0' 并退出transec(10)函数
  11. 递归结束
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2018-6-25 17:10:19 | 显示全部楼层
本帖最后由 cable 于 2018-6-25 17:11 编辑


哇,太感谢啦,感谢你这么耐心,我说怎么一直想不清楚,原来是这样的,赞你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-27 10:02:42 | 显示全部楼层
再复习一下:
transec(11)
str1='' str1=transec(5) return transec(5)+11%2(1)

transec(5)
str1='' str1=transec(2) return transec(2)+5%2(1)

transec(2)
str1='' str1=transec(1) return transec(1)+2%2(0)

transec(1)
str1='' str1=transec(0) return transec(0)+1%2(1)

transec(0)
str1='' return ''

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

使用道具 举报

发表于 2018-6-28 13:46:52 From FishC Mobile | 显示全部楼层
还没学到。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-5 22:38:00 | 显示全部楼层

感谢大佬,看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 06:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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