我在实现快速排序算法时遇到了问题,就像在本例中一样,python解释器自动重新启动而不返回答案。我找不到比这个更相似的问题了。由于这篇文章自 2012 年以来一直处于非活动状态并且问题没有解决,我决定再次询问。这是我的代码:
#coding:utf8
import time
import sys
sys.setrecursionlimit(1000000)
x=eval(input("Type a list: "))
start=time.time()
L=[]
R=[]
L_=[]
R_=[]
c=0
z=x[0]
for j in range(1,len(x)):
if x[j]>= z:
R.append(x[j])
elif x[j] <= z:
L.append(x[j])
def fun(x,lista,c):
for i in range(len(x)-1):
for j in range(i+1,i+2):
if x[i]<=x[j] and c!=len(x)-2:
c+=1
elif x[i]>x[j]:
lista.append(x[i])
lista.append(x[j])
x[i]=lista[1]
x[j]=lista[0]
lista=[]
c=0
return fun(x,lista,c)
elif x[i]<=x[j] and c==len(x)-2:
c=0
return x
fun(L,L_,c)
fun(R,R_,c)
print(L+[z]+R)
end=time.time()
print(end-start)
我使用的Python版本是3.4。正如你所看到的,我使用了
sys
库来增加递归限制,但这并没有解决我的问题。我测试了它,如果我是对的,它可以对 300>X>250 范围内的“X”个元素进行排序。我怎么解决这个问题?先感谢您。
正常空闲(除非以 -n 启动)在用户子进程中运行用户代码。 RESTART 行表示子进程已重新启动。无论如何启动 Idle(不带 -n),当选择 Shell -> Restart Shell Cntl+F6 或 Run -> Run Module F5 时,都会发生这种情况。
如果用户进程因程序错误而崩溃,也会发生 RESTART。如果从命令行(
python -m idlelib
,或 2.x 中的 ... idlelib.idle
)启动 Idle,那里可能会出现一条错误消息,但您的程序不会发生这种情况。
首先用具体的作业替换输入行(您应该在发布之前完成)之后,我用 3.4.3 运行了您的程序
x = list(reversed(range(1000)))
(对于许多排序算法来说,这个特定的选择是最坏的情况)。
我在命令窗口中没有看到任何内容,但确实看到了 Windows 消息:python.exe 已停止工作。由于 Idle 仍在运行,这指的是错误进程。
将 1000000 减少到 10000 并没有改变任何东西。将递归限制保留在 1000 会导致很长的回溯。
Traceback (most recent call last):
File "C:\Programs\python34\tem.py", line 33, in <module>
fun(L,L_,c)
File "C:\Programs\python34\tem.py", line 29, in fun
return fun(x,lista,c)
....
File "C:\Programs\python34\tem.py", line 29, in fun
return fun(x,lista,c)
File "C:\Programs\python34\tem.py", line 18, in fun
for i in range(len(x)-1):
RuntimeError: maximum recursion depth exceeded in comparison
将列表大小减少到 100 并没有改变结果。你有一个无限循环,你需要防止它。
您的代码看起来不像我熟悉的快速排序版本。也许你应该回顾一下算法的定义。
但是,这条线 对于范围 (i+1,i+2) 内的 j: 看起来像一个 bug,因为它只迭代一次,带有
j = i+1
。事实上,如果您将其替换为该行并缩进以下行,则程序运行相同。
无论如何,都不满足终止条件
x[i]<=x[j] and c==len(x)-2
。我建议从只有几个项目的简短列表开始,然后将打印语句添加到 fun
以查看值与您的期望有何偏差。您也可以尝试手动执行算法。
我正想问同样的问题,所以屈服于 stackoverflow。
我的Python在长Python程序期间重新启动,更具体地说,主要是在程序调用外部程序期间(例如在调用FFMPEG或使用system.os命令调用Tesseract期间)。
我在 stackoverflow 上搜索了 4 个问题,我了解到以下内容:
Python IDLE 在子进程中运行用户代码,如果该子进程崩溃,则会发生 RESTART。 (感谢特里·简·里迪)。
我相信这是我的问题(子进程崩溃)。
起初,我以为这是一个硬件问题:我测试了我的CPU,检查了我的硬盘,用Memtest测试了我的RAM......并且没有检测到错误。
然后我在第二台计算机上运行我的程序,这与我的第一台计算机完全相同:在第二台计算机上一切正常,但在我的第一台计算机上则不然。
之后我运行了 SystemFileCheck(我使用的是 Windows),发现我的操作系统存在无法解决的问题。
最后我删除了操作系统分区并重新安装了Windows。
现在一切都很好。 --> 所以我的 Windows 无缘无故地杀死了我的 python 进程。
结论:
修复:检查程序是否有错误,并修复或重新安装操作系统。