关于递归

2020-05-15 11:05:18 +08:00
 craiiz

迫于最近不小心看到了《算法图解》,遂开始学习排序;当试到快排时,有个问题让人很疑惑: 最初版本: 这里当递归出口条件为 数组长度等于 1 时,会报错; 修改后的版本: 将出口条件修改为数组长度<2 时,就能正常运行

问题: len(array)<2 和 len(array) == 1 这两句话不是等价的么?????

1468 次点击
所在节点    问与答
14 条回复
chairuosen
2020-05-15 11:09:46 +08:00
也可能是 0 啊
shintendo
2020-05-15 11:11:16 +08:00
等于 1 和小于 2 怎么会是等价的??
craiiz
2020-05-15 11:14:00 +08:00
@chairuosen 关键是无论哪种写法,它都到不了 0 啊。给的数据长度都是大于 2 的,每次递归拆分列表的时候,如果长度要到 0,一定要先变 1 。

也可能是我没想明白。
gwy15
2020-05-15 11:16:54 +08:00
怎么就到不了 0 了,
qs([1,0]) -> pivot=1, greater = [], smaller = [0]
qs([]) -> boom
craiiz
2020-05-15 11:17:16 +08:00
@shintendo 我是这么想的:列表长度不可能小于 0 吧? 可能是 0,但要变为 0,肯定会先变成 1 。既然两种情况(被排序的列表不停地被拆分)都必然会经过 len(array) == 1 的情况,那么在这限定条件下,这两种写法就是等价的。
rabbbit
2020-05-15 11:17:53 +08:00
例如 1 2 3 4 5 6

此时 base_line 为 1
greaters 为 [2, 3, 4, 5, 6]
smallers 为 []
所以报错了
craiiz
2020-05-15 11:18:13 +08:00
@gwy15 boom 。明白了,感谢。
craiiz
2020-05-15 11:18:31 +08:00
@rabbbit 明白了,感谢。
craiiz
2020-05-15 11:18:43 +08:00
此题终结
chairuosen
2020-05-15 11:19:15 +08:00
另外:遇到自己想不明白的问题,每一行结果都打日志看呀,又不是黑盒
yuruizhe
2020-05-15 11:20:32 +08:00
@craiiz 当 pivot 是最小值,smallers 是一个空数组,继续对 smallers 调用 sort(),就会无限递归下去;反之,当 pivot 是最大值,greaters 是一个空数组,继续对 greater 调用 sort(),也会无限递归下去,用例:[1,6,5,4,3,2,]
craiiz
2020-05-15 11:24:55 +08:00
@chairuosen 了解,我用 IDE 好了,现在想着学习就只用终端加记事本了。
craiiz
2020-05-15 11:25:13 +08:00
@yuruizhe 明白了,谢谢大神
crella
2020-05-15 11:31:25 +08:00
我看其他人写的 py 脚本,一般不都是把 import 语句放在文件开头的吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/671932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX