为什么这段代码会让我的电脑崩溃,不仅是我的电脑,还有我的朋友?

问题描述 投票:0回答:4

我正在练习编写 python 代码,我试图从 1,1,... 生成斐波那契数列的数字。 我写的,非常好,但后来发生了一些奇怪的事情,我把它写在这里:

# Generating Fibonacci Series in a List:
N = 1
M = 1
Fibonacci = []

ChoiceMethod = 0
ChoiceNum = 0
BelowNum = 0

ChoiceMethod = input('Choose Your Method of Work (1/2/3): ')
if int(ChoiceMethod) == 1:
    ChoiceNum = input('Give your Choice Number: ')
    while len(Fibonacci) != int(ChoiceNum):
        Fibonacci.append(N)
        Fibonacci.append(M)
        N += M
        M += N
    print(Fibonacci)

您知道这是代码的第一部分,如果您运行代码并在输入中输入 1(第一种方法),然后当它说给出您的选择编号时,例如给它一个偶数,例如 2,它将起作用很好,就像任何偶数一样。一旦你给它一个奇数,比如 5,它就会使电脑崩溃。我不明白为什么。 如果您将“len(Fibonacci) != int(ChoiceNum)”中的“!=”更改为“<" it will work fine but idk what's wrong overally. I'M TELLING YOU, IT WILL MOST PROBABLY CRASH YOUR PC TOO, Be Careful with it.

”,也找到了修复方法
python
4个回答
1
投票

您正在造成无限循环。

如果您引入像 5 这样的奇数,请注意每次迭代都会添加两个数字,这意味着斐波那契列表的长度永远不会是奇数,它总是偶数。为此,您应该检查必须引入的数字并运行循环,同时检查序列的最大数字,并且可能会中断循环或仅添加 1 个元素。


1
投票

正如其他答案所解释的那样,您的程序中存在一个错误,这意味着它是一个无限循环。 所以它实际上做的是建立一个不断增长的更大斐波那契数列。

无限大的列表需要无限量的内存。 由于数字本身没有上限,这意味着更多的内存。

但是为什么它会让你的电脑崩溃?

Python 对其使用的内存量没有任何内置限制。 因此,像您这样的病态 Python 脚本只会不断向操作系统请求越来越多的内存。 这不利于 PC 的稳定性。 可能会发生一些事情:

  • 当操作系统耗尽物理RAM时,它将开始分配虚拟内存。 但虚拟内存的工作原理是在物理 RAM 和硬盘或 SSD 之间交换虚拟内存页面。 操作系统通常会从其他应用程序获取内存页面。

    如果进行过多的交换,则分页速率超出系统的跟上能力。 最终一些重要的系统服务受到影响......系统崩溃。

  • 某些操作系统可以防御产生过多分页活动的程序。 例如,在 Linux 上有一个称为 OOM Killer 的内核进程,它尝试识别正在创建过多分页的进程。 当它找到一个时,它就会杀死它。

    问题在于 OOM Killer 可以识别出错误的“罪魁祸首”。 但如果受害者是一个重要的系统服务,并且 OOM Killer 杀死了它......崩溃。

幸运的是,这种碰撞通常不会造成任何长期损害。


0
投票

试试这个:

Fibonacci = [1, 1]
...
    while len(Fibonacci) != int(ChoiceNum):
        Fibonacci.append(Fibonacci[-2] + Fibonacci[-1])

通过此循环,您将把斐波那契列表的最后两个数字的总和添加到列表本身。这样你的 ChoiceNum 可能会不均匀。 !但是!,请进行额外检查以查看 IF ChoiseNum == 1 返回斐波那契列表的第一个值,否则执行 while 循环。


0
投票

抱歉,但我无能为力,但我确实以俄罗斯轮盘赌的形式使用了您代码的修改版本

© www.soinside.com 2019 - 2024. All rights reserved.