lsc00844 发表于 2020-6-12 23:56:54

递归函数没有返回值?

为啥这函数执行了啥都没有?

函数外定义一个列表再函数内声明全局变量,再调用列表又有了。

Twilight6 发表于 2020-6-12 23:58:51

本帖最后由 Twilight6 于 2020-6-13 00:00 编辑

....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑

snipaste 这个截屏软件好用F1 截屏

lsc00844 发表于 2020-6-13 00:01:06

Twilight6 发表于 2020-6-12 23:58
....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑


前面拍的照,在群里问了下没人回复。。就发这来了,后面还是截图好。

Twilight6 发表于 2020-6-13 00:02:11

本帖最后由 Twilight6 于 2020-6-13 00:03 编辑

lsc00844 发表于 2020-6-13 00:01
前面拍的照,在群里问了下没人回复。。就发这来了,后面还是截图好。


列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、remove、insert、extend、sort等都是没有返回值的,但是 pop 有返回值,将列表元素取出并返回

lsc00844 发表于 2020-6-13 00:12:36

Twilight6 发表于 2020-6-13 00:02
列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、 ...

>>> def Dec2Bin(dec):
        temp=[]
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        return temp

>>> Dec2Bin(9)
>>> def Dec2Bin(dec):
        temp=[]
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        print(temp)

       
>>> Dec2Bin(9)
>>> temp=[]
>>> def Dec2Bin2(dec):
        global temp
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        return temp

>>> Dec2Bin2(9)
>>> temp

>>> temp

>>> temp=[]
>>> def Dec2Bin_2(dec):
        global temp
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin_2(dec//2)
        return temp

>>> Dec2Bin_2(9)
>>> temp

>>> def Dec2Bin(dec):
        temp=[]
        result=''
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        while temp:
                result=result+str(temp.pop())
        return result

>>> Dec2Bin(9)
>>>


这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。

Twilight6 发表于 2020-6-13 00:52:19

本帖最后由 Twilight6 于 2020-6-13 00:55 编辑

lsc00844 发表于 2020-6-13 00:12
这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。

先把这个循环去掉,如果用循环还不如直接不用递归哈
while temp:
                result=result+str(temp.pop())
还有函数返回值在 IDLE交互界面会自动打印,而如果是在编译器编辑然后运行是不会自己打印 return 的结果的 要 加上 print(Dec2Bin(10)) 这样

列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、remove、insert、extend、sort等都是没有返回值的,但是 pop 有返回值,将列表元素取出并返回
所以这边不能返回 temp.append(1),不然返回的是 None

而且 你的 if 条件有些差错,递归设置一个出口,当递归到0的时候就退出递归 返回列表

最后帮你代码改了一下:
def Dec2Bin(dec):
    temp = []
    if dec == 0:
      return temp
    else:
      quo = dec % 2
      temp.append(quo)
      return Dec2Bin(dec // 2)+temp

print(Dec2Bin(10))
因为你返回的是列表 所以打印的结果也是列表,所以递归结束时候你可以这样打印:
def Dec2Bin(dec):
    temp = []
    if dec == 0:
      return temp
    else:
      quo = dec % 2
      temp.append(quo)
      return Dec2Bin(dec // 2)+temp
   
print('0b',end='')
for i in Dec2Bin(10):
    print(i,end='')
输出结果是:
>>> 0b1010
0b 开头代表着数字是二进制数字

弄成字符串更好,直接拼接就可以:
def Dec2Bin(dec):
    temp = ''
    if dec == 0:
      return temp
    else:
      temp += str(dec%2)
      return Dec2Bin(dec // 2)+temp

print('0b'+Dec2Bin(10))

jackz007 发表于 2020-6-13 00:56:22

def dec2bin(dec):
    if dec == 0 : return ''
    else : return dec2bin(dec // 2) + str(dec % 2)
print(dec2bin(9))

lsc00844 发表于 2020-6-13 02:11:42

Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有函数返回值在 IDLE交互界面会自动打印, ...

def Dec2Bin(dec):
        temp=[]
        if dec==0:
                return temp
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        return temp

>>> Dec2Bin(9)
[]

这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行的?

lsc00844 发表于 2020-6-13 02:14:14

Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有函数返回值在 IDLE交互界面会自动打印, ...

感谢大神,看懂了,应为return 的None,所以没反应。。

lsc00844 发表于 2020-6-13 02:17:34

Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有函数返回值在 IDLE交互界面会自动打印, ...

这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行的?
如果是递归进去的时候执行的,执行到dec==0,返回temp,这个时候的temp是有东西的
temp就是倒数第二层Dec2Bin(1//2)这个函数的返回值,应该可以一步一步的返回到最初的Dec2Bin(dec)的吧?
可是去掉最后的+temp,就返回一个空列表
这里没搞懂是怎么递归回去的。。感谢感谢

lsc00844 发表于 2020-6-13 02:24:38

jackz007 发表于 2020-6-13 00:56


大神,这代码没看懂。。
后面的+str(dec%2)
这一部分加哪里去了,后面的这一部分是和dec2bin(dec//2)一起往下执行,还是另外分了一条线..
对递归理解的还不透彻。
感谢~

lsc00844 发表于 2020-6-13 02:55:30

>>> def Dec2Bin(dec):
        def fun1(dec):
          temp = []
          if dec == 0:
                return temp
          else:
                quo = dec % 2
                temp.append(quo)
                return fun1(dec // 2)+temp
        result='0b'
        for i in fun1(dec):
                result=result+str(i)
        return result

>>> Dec2Bin(9)
'0b1001'
>>> Dec2Bin(999)
'0b1111100111'
>>> bin(999)
'0b1111100111'
>>>

函数又优化了下,可以直接出结果了。。

Twilight6 发表于 2020-6-13 07:16:22

lsc00844 发表于 2020-6-13 02:17
这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行 ...

只有最后一次递归执行的是 :
if dec==0:
      return temp
其他都是在执行
else:
            quo=dec%2
            temp.append(quo)
            return Dec2Bin(dec//2)

xiaosi4081 发表于 2020-6-13 07:19:13

本帖最后由 xiaosi4081 于 2020-6-13 07:21 编辑

送你一张图:{:10_256:}

永恒的蓝色梦想 发表于 2020-6-13 08:32:03

Twilight6 发表于 2020-6-12 23:58
....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑


我怀疑他是来炫耀电脑的{:10_266:}

Twilight6 发表于 2020-6-13 08:34:22

永恒的蓝色梦想 发表于 2020-6-13 08:32
我怀疑他是来炫耀电脑的

{:10_266:}同感 ,楼主土豪 我们交个朋友吧

lsc00844 发表于 2020-6-13 17:36:39

xiaosi4081 发表于 2020-6-13 07:19
送你一张图:

哈哈哈,学会了,一定改正

lsc00844 发表于 2020-6-13 17:37:16

永恒的蓝色梦想 发表于 2020-6-13 08:32
我怀疑他是来炫耀电脑的

随手拍的。。以后还是用截图。。{:5_96:}

lsc00844 发表于 2020-6-13 17:37:56

Twilight6 发表于 2020-6-13 08:34
同感 ,楼主土豪 我们交个朋友吧

就是单纯的学编程。。

Twilight6 发表于 2020-6-13 17:38:28

lsc00844 发表于 2020-6-13 17:37
就是单纯的学编程。。

哈哈哈
页: [1]
查看完整版本: 递归函数没有返回值?