972619178 发表于 2020-4-12 04:11:13

哪位大神给我讲解一下23、24讲课后作业第0题,自己把自己绕进去了

0. 使用递归编写一个十进制转换为二进制的函数(要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式)。

参考代码:
def Dec2Bin(dec):
    result = ''
   
    if dec:
      result = Dec2Bin(dec//2)                #问题:在这里调用自身的话,下面return result + str(dec%2)这一行是否还会执行,result的值是否会初始化
      return result + str(dec%2)                               
    else:
      return result

print(Dec2Bin(62))

leon_xinxin 发表于 2020-4-12 04:53:56

return result + str(dec%2)这一行是倒序执行的。一个简单的例子:
print(Dec2Bin(2)):
初始层:2>0:result=Dec2Bin(2//2=1):#进入第一层递归
1>0,result=Dec2Bin(1//2=0):#进入第二层递归
0=0,执行else:result=''#返回第一层递归,这时候result是空的
return result + str(1%2=1) ,# 这时候result就是'1',然后返回初始层
return result + str(2%2=0) ,#这时候result就是‘10’
然后result='10'被打印出来
希望能被采纳!
   

qiuyouzhi 发表于 2020-4-12 08:11:43

会执行,但不会重复初始化。递归不是重复调用自己,是进入下一层,
这里调用的Dec2Bin并不会影响这一层的Dec2Bin,
最后接收的就是Dec2Bin的返回值(result),
然后拼接到一起。

972619178 发表于 2020-4-12 15:41:45

qiuyouzhi 发表于 2020-4-12 08:11
会执行,但不会重复初始化。递归不是重复调用自己,是进入下一层,
这里调用的Dec2Bin并不会影响这一层的D ...

感谢指点,但觉得楼上的说的更详细一点~

972619178 发表于 2020-4-12 15:42:51

leon_xinxin 发表于 2020-4-12 04:53
return result + str(dec%2)这一行是倒序执行的。一个简单的例子:
print(Dec2Bin(2)):
初始层:2>0:res ...

感谢

mozhihui 发表于 2020-6-28 19:15:16

qiuyouzhi 发表于 2020-4-12 08:11
会执行,但不会重复初始化。递归不是重复调用自己,是进入下一层,
这里调用的Dec2Bin并不会影响这一层的D ...

‘“会执行,但不会重复初始化。递归不是重复调用自己,是进入下一层。”
这里的局部变量想了半天绕不出来。。
意思是说result=''在每一层都被调用,上上一层的返回值继续作用回上一层,相当于不断更新result的值。
而返回的result实际上与当层的result不是同一个变量了(只是传回了字符串),因此两个result互不影响。
这里理解对吗?

qiuyouzhi 发表于 2020-6-29 08:49:16

mozhihui 发表于 2020-6-28 19:15
‘“会执行,但不会重复初始化。递归不是重复调用自己,是进入下一层。”
这里的局部变量想了半天绕不出 ...

是的,递归5层,就是5个result拼接起来。

mozhihui 发表于 2020-6-29 13:59:16

qiuyouzhi 发表于 2020-6-29 08:49
是的,递归5层,就是5个result拼接起来。

谢谢!!在递归这里被打击了积极性。。还是先往后看回头再复习{:10_250:}
页: [1]
查看完整版本: 哪位大神给我讲解一下23、24讲课后作业第0题,自己把自己绕进去了