cable 发表于 2018-6-25 11:58:42

菜鸟来求助一下23课递归的作业

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 12:18:15

本帖最后由 凌九霄 于 2018-6-25 13:22 编辑

1、这里的 if x 是 if x != 0的意思
2、这个str1的值要递归到最后一层完成后才能反向依次确定

cable 发表于 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)

cable 发表于 2018-6-25 13:51:28

我好像有点明白了,由于函数return的是str1+str(x%2),因此str1=tansec(x//2)就可以理解为str1=str1+str(x%2),不断调用直到循环失败,而由于是栈存储,所以str1的自加和x//2都会不断的迭代,所以程序才能成功。
不知道理解的是否正确。

cable 发表于 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

凌九霄 发表于 2018-6-25 16:27:10

本帖最后由 凌九霄 于 2018-6-25 16:42 编辑

递归开始(假设求10的二进制数)
1、transec(10)x=10
2、str1 = transec(5)x=5   str1 = ''
3、str1 = transec(2)x=2   str1 = ''
4、str1 = transec(1)x=1   str1 = ''
5、str1 = transec(0)x=0 所以执行else下语句,   return ''          并退出transec(0)函数
6、执行transec(1) 函数下的return str1+str(1%2)return '' + '1'    并退出transec(1)函数
7、执行transec(2) 函数下的return str1+str(2%2)return '1' + '0'   并退出transec(2)函数
8、执行transec(5) 函数下的return str1+str(5%2)return '10' + '1'并退出transec(5)函数
9、执行transec(10)函数下的return str1+str(10%2) return '101' + '0' 并退出transec(10)函数
递归结束

cable 发表于 2018-6-25 17:10:19

本帖最后由 cable 于 2018-6-25 17:11 编辑

凌九霄 发表于 2018-6-25 16:27


哇,太感谢啦,感谢你这么耐心,我说怎么一直想不清楚,原来是这样的,赞你!

cable 发表于 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

eq12315 发表于 2018-6-28 13:46:52

还没学到。。

八云式 发表于 2018-8-5 22:38:00

凌九霄 发表于 2018-6-25 16:27


{:10_266:}感谢大佬,看懂了
页: [1]
查看完整版本: 菜鸟来求助一下23课递归的作业