鱼C论坛

 找回密码
 立即注册
查看: 1242|回复: 15

[已解决]为啥我编的这个递归会溢出啊?

[复制链接]
发表于 2018-4-25 17:16:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 三与七之间 于 2018-4-25 17:36 编辑

我是在做小甲鱼零基础入门学习python第44降动手00的时候编的如下代码,背景:编写计时器,大致思路就是程序开始运行时以及结束运行时都可以生成一个有6个元素的列表(分别为【年,月,日,时,分,秒】),然后把两个列表按个儿相减就可以得到程序运行多久,但是如果开始计时的时间是2022年2月22日16:30:30,停止的时间是2025年1月23日15:30:30的话,就会出现负数,为了解决这个问题编以下代码:

#trans(L)这个函数的大致思路就是先判断是否为负数,是的话,看其是月日天时分秒里的那个数,然后让他的前个元素减1,他自己呢做减法
#t(L)这个函数里我放了一个递归,因为也许转化一次之后列表里还是有负数,所以需要再进行转化,所以就编了下边几句,可是运行结果却很悲惨,栈溢出了。。。。瞅了半天没想通  哪出错了,感觉不应该啊。。。。


  1. L2 = []


  2. def trans(L):
  3.     for index in range(6):
  4.         if L[index] >= 0:
  5.             L2.append(L[index])
  6.         else:
  7.             if index == 1:
  8.                 L2[index - 1] -= 1
  9.                 L2.append((12 + L[index]))
  10.             elif index == 2:
  11.                 L2[index - 1] -= 1
  12.                 L2.append((30 + L[index]))
  13.             elif index == 3:
  14.                 L2[index - 1] -= 1
  15.                 L2.append((24 + L[index]))
  16.             elif index == 4:
  17.                 L2[index - 1] -= 1
  18.                 L2.append((60 + L[index]))
  19.             elif index == 5:
  20.                 L2[index - 1] -= 1
  21.                 L2.append((60 + L[index]))
  22.     return L2


  23. def t(L):
  24.     k = 0
  25.     for each in L:

  26.         if each < 0:
  27.             k += 1
  28.         else:
  29.             continue

  30.     if k == 0:
  31.         return L
  32.     else:
  33.         L_new = trans(L)
  34.         return t(L_new)


  35. L = [1, -2, 0, -1, 10, 10]
  36. print(t(L))
复制代码
最佳答案
2018-4-25 18:22:02


  1. def trans(L):
  2.     # 做减法的时候,应该从末位开始算起,这样才方便退位
  3.     L2 = L[:]
  4.     for index in range(5, 0, -1):

  5.         if L[index] < 0:
  6.             if index == 1:
  7.                 L2[index - 1] -= 1
  8.                 L2[index] = 12 + L[index]
  9.             elif index == 2:
  10.                 L2[index - 1] -= 1
  11.                 L2[index] = 30 + L[index]
  12.             elif index == 3:
  13.                 L2[index - 1] -= 1
  14.                 L2[index] = 24 + L[index]
  15.             elif index == 4:
  16.                 L2[index - 1] -= 1
  17.                 L2[index] = 60 + L[index]
  18.             elif index == 5:
  19.                 L2[index - 1] -= 1
  20.                 L2[index] = 60 + L[index]
  21.     return L2


  22. def t(L):
  23.     for each in L:
  24.         if each < 0:
  25.             L_new = trans(L)
  26.             return t(L_new)
  27.     return L


  28. L = [1, -2, 0, -1, 10, 10]
  29. print(t(L))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-25 17:31:01 | 显示全部楼层
"开始计时的时间是2022年2月22日16:30:30,停止的时间是2015年1月23日15:30:30"
也许是我眼花了……请问你是坐时光机回来的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 17:36:14 | 显示全部楼层
ABC23 发表于 2018-4-25 17:31
"开始计时的时间是2022年2月22日16:30:30,停止的时间是2015年1月23日15:30:30"
也许是我眼花了……请 ...


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

使用道具 举报

 楼主| 发表于 2018-4-25 17:37:17 | 显示全部楼层
三与七之间 发表于 2018-4-25 17:36
。。。。。写反了。。。

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

使用道具 举报

发表于 2018-4-25 17:59:58 | 显示全部楼层
L2.append((12 + L[index])) 你加入到L2中的元素是负的,这样还能全变成正的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:00:40 | 显示全部楼层
说错了, L2[index - 1] -= 1
正的不是变负的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:01:19 | 显示全部楼层
代码能注释一下,说明你想做的事情么,逻辑有点理不清
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:22:02 | 显示全部楼层    本楼为最佳答案   


  1. def trans(L):
  2.     # 做减法的时候,应该从末位开始算起,这样才方便退位
  3.     L2 = L[:]
  4.     for index in range(5, 0, -1):

  5.         if L[index] < 0:
  6.             if index == 1:
  7.                 L2[index - 1] -= 1
  8.                 L2[index] = 12 + L[index]
  9.             elif index == 2:
  10.                 L2[index - 1] -= 1
  11.                 L2[index] = 30 + L[index]
  12.             elif index == 3:
  13.                 L2[index - 1] -= 1
  14.                 L2[index] = 24 + L[index]
  15.             elif index == 4:
  16.                 L2[index - 1] -= 1
  17.                 L2[index] = 60 + L[index]
  18.             elif index == 5:
  19.                 L2[index - 1] -= 1
  20.                 L2[index] = 60 + L[index]
  21.     return L2


  22. def t(L):
  23.     for each in L:
  24.         if each < 0:
  25.             L_new = trans(L)
  26.             return t(L_new)
  27.     return L


  28. L = [1, -2, 0, -1, 10, 10]
  29. print(t(L))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:23:28 | 显示全部楼层
经过我的反复调试。因为你每次都没有对L2这个列表进行清空,导致l2这个列表的元素一直在增加,而前面的元素也得不到修正,所以产生了递归无法正常退出的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 18:34:37 | 显示全部楼层
BlueSand 发表于 2018-4-25 17:59
L2.append((12 + L)) 你加入到L2中的元素是负的,这样还能全变成正的?

比如[0,2,-2,1,2,3]里头索引值为1和-2 的那俩元素吧,首先呢就是-2是负数,然后从前一位借个1(也就是借12月),算完后,这个元素变为10(12-2);相对应的前边的2就应该减个1,变为1个月;最后列表不就变成:[0,1,10,1,2,3]了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 18:35:22 | 显示全部楼层
BlueSand 发表于 2018-4-25 18:23
经过我的反复调试。因为你每次都没有对L2这个列表进行清空,导致l2这个列表的元素一直在增加,而前面的元素 ...

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

使用道具 举报

发表于 2018-4-25 18:37:31 | 显示全部楼层
三与七之间 发表于 2018-4-25 18:34
比如[0,2,-2,1,2,3]里头索引值为1和-2 的那俩元素吧,首先呢就是-2是负数,然后从前一位借个1(也就是借1 ...

你后面的正了,可是前面的让你变成负的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 18:38:52 | 显示全部楼层

我明白啦,谢谢你~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:39:15 | 显示全部楼层
这样搞法的结果就是,如果 一次不成功,会导至这个列表的元素个数变的越来越多,而后加入的元素因为不在0-5这批索引 里面,导致无法被修改。你在循环头里加一个print(L2)把列表打印出来你就知道 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 18:44:08 | 显示全部楼层
三与七之间 发表于 2018-4-25 18:38
我明白啦,谢谢你~~~

因为列表是引用数据 ,所以,在进行列表的操作的时候,不能当成整型那样,想改就改了,因为改完后,在函数里改的,会在外面保留结果。
如果想做为只在函数里起作用的列表应该定义在函数体内而不是函数体外
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 18:59:17 | 显示全部楼层
BlueSand 发表于 2018-4-25 18:44
因为列表是引用数据 ,所以,在进行列表的操作的时候,不能当成整型那样,想改就改了,因为改完后,在函 ...

嗯呢~~一阵见血呀~~谢谢你~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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