水月秋寒 发表于 2020-1-31 16:02:14

看完函数章节已经彻底懵逼了,第023、024讲:递归:这帮小兔崽子、汉诺塔

1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==>



def num(x):
    result = []
    if x:
      num(x//10)
      return result.append(x%10)

   
x = int(input('plz input:'))
print(num(x))


plz input:12345
None


为啥出不来{:5_99:}

zltzlt 发表于 2020-1-31 16:17:51

result.append() 没有返回值,不能这么写。应该这样:

result = []


def num(x):
    if x:
      result.append(x % 10)
      return num(x // 10)
    else:
      # 将 result 翻转
      result.reverse()
      return result


x = int(input('plz input:'))
print(num(x))

水月秋寒 发表于 2020-2-1 12:10:33

zltzlt 发表于 2020-1-31 16:17
result.append() 没有返回值,不能这么写。应该这样:

Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是如果把result = []拿到外面,就能实现出题目里的要求,想了半天也没明白

def num(x):
result = []
    if x:
      num(x//10)
      result.append(x%10)
      return result
    else:
      return result

   
x = int(input('plz input:'))
print(num(x))

plz input:10




===========================


result = []
def num(x):

    if x:
      num(x//10)
      result.append(x%10)
      return result
    else:
      return result

   
x = int(input('plz input:'))
print(num(x))

plz input:10

XiaoPaiShen 发表于 2020-2-1 12:40:54

水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...

只有版主才能回答吗?{:10_243:}

zltzlt 发表于 2020-2-1 12:50:18

水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...

由于这是递归函数,所以如果把 result = [] 放在函数里面,每次递归都要执行 result = [],导致 result 被清空,当然只有最后添加的数据 0 了。

水月秋寒 发表于 2020-2-1 13:00:25

zltzlt 发表于 2020-2-1 12:50
由于这是递归函数,所以如果把 result = [] 放在函数里面,每次递归都要执行 result = [],导致 result...

我晕了{:5_99:},写在函数外面的也可以被函数用?

水月秋寒 发表于 2020-2-1 13:01:03

XiaoPaiShen 发表于 2020-2-1 12:40
只有版主才能回答吗?

{:5_99:}不是鸭 ,只有版主回复我了。。

zltzlt 发表于 2020-2-1 13:02:01

水月秋寒 发表于 2020-2-1 13:00
我晕了,写在函数外面的也可以被函数用?

可以啊,只要不用赋值操作符 = 为它重新赋值就可以用(可以访问它的方法)。

XiaoPaiShen 发表于 2020-2-1 13:37:27

本帖最后由 XiaoPaiShen 于 2020-2-1 13:48 编辑

水月秋寒 发表于 2020-2-1 13:01
不是鸭 ,只有版主回复我了。。

递归分为 递去 和 归来:

下面的程序在递去时只是压栈,在栈中的参数依次为 12345, 1234, 123, 12, 1, 0
在归来时, result 的值分别为:

[], , ...
最后的返回值就是
def get_digits(n):
    if n > 0:
      result = get_digits(n // 10)
      result.append(n % 10)
    else:
      result = []
    return result

print(get_digits(12345))

jiong_jiong 发表于 2020-7-9 13:38:29

本帖最后由 jiong_jiong 于 2020-7-9 16:15 编辑

水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...

我跟你的问题一模一样。翻了很多帖子改好了回答你。

你写的result[],可以作为全局变量而无需单独申明,所以不管在函数的内外都可以访问。
但是你写在函数内,每次递归后,都会执行一次result[]=[],就会被清空。解释点这里。

改成这样就对了:
list1=[]
def get_digits(n):
##    list1 =[],我之前写在这里的,也是不行的
    if n:
      list1.append(n%10)      
      return get_digits(n//10)      
    else:
      list1.reverse()
      return print(list1)


另外不要试图写print(list1.reverse()),这个句子输出不了列表。

如果有解答到你的疑问,请给最佳。

永恒的蓝色梦想 发表于 2020-7-9 14:34:21

jiong_jiong 发表于 2020-7-9 13:38
我跟你的问题一模一样。翻了很多帖子改好了回答你。

你写的result[],他不是一个变量(因此没有局部 ...

你写的result[],他不是一个变量那它是啥?

Stubborn 发表于 2020-7-9 15:26:13

永恒的蓝色梦想 发表于 2020-7-9 14:34
那它是啥?

他不是一个变量,而是一个全局变量{:10_330:}

永恒的蓝色梦想 发表于 2020-7-9 15:30:43

Stubborn 发表于 2020-7-9 15:26
他不是一个变量,而是一个全局变量

这不就是亲妈不是妈的逻辑吗……{:10_258:}

Stubborn 发表于 2020-7-9 15:34:49

永恒的蓝色梦想 发表于 2020-7-9 15:30
这不就是亲妈不是妈的逻辑吗……

{:10_253:}

jiong_jiong 发表于 2020-7-9 16:10:58

永恒的蓝色梦想 发表于 2020-7-9 15:30
这不就是亲妈不是妈的逻辑吗……

所以,我还是理解错了吗?
列表是全局变量?

谢谢指教。
页: [1]
查看完整版本: 看完函数章节已经彻底懵逼了,第023、024讲:递归:这帮小兔崽子、汉诺塔