python 编写一些简单的数字程序

237 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

一些简单的数字程序

现在我们已经介绍了一些基本的Python构造,现在是时候开始考虑如何组合这些构造来编写简单的程序了。在此过程中,我们将潜入更多的语言结构和一些算法技术。

详尽枚举

图 3-1 中的代码打印整数多维数据集根(如果存在)。如果输入不是完美的立方体,它将打印一条消息以达到该效果。运算符 != 表示不相等。

image.png

代码首先尝试将变量 ans 设置为 x 绝对值的多维数据集根。如果成功,则如果 x 为负,则将 ans 设置为 -ans。此代码中的繁重工作(如现在这样)在而循环。每当程序包含循环时,了解导致程序最终退出此循环的原因非常重要。对于 x 的哪些值,这个 while 循环将终止?答案是“所有整数”。这可以很简单地争论。

表达式 ans**3 的值从 o 开始,每次通过循环时都会变大。

·当它达到或超过 abs (x) 时,循环终止。

·由于 abs (x) 始终为正数,因此在循环必须终止之前,只有有限次数的迭代。

此参数基于递减函数的概念。这是一个具有以下属性的函数:

·它将一组程序变量映射到整数。

·输入循环时,其值为非负值。

·当其值为 ≤ 0 时,循环终止。

·每次通过循环时,其值都会减小。

Eigure 3= 1 中 while 循环的递减函数是什么?它是腹肌 (x) - 和**3。

现在,让我们插入一些错误,看看会发生什么。首先,尝试注释掉语句 ans = 0。Python 解释器打印错误消息

image.png

因为解释器试图在它被绑定到任何东西之前找到ans绑定到的值。现在,恢复 ans 的初始化,替换语句 ans = ans +1 by ans = ans,并尝试找到 8 的立方根。厌倦了等待后,输入“控制c”(同时按住Ctrl键和c键)。这将返回到 shell 中的用户提示。现在,添加语句

image.png

在循环的开头,然后再次尝试运行它。这次它将打印

image.png

该程序将永远运行,因为循环体不再减少ans**3和abs(x)之间的距离。当面对一个似乎不会终止的程序时,有经验的程序员经常插入 print 语句,例如此处的语句,以测试递减函数是否确实正在递减。

此程序中使用的算法技术是猜测和检查的变体,称为穷举枚举。我们列举所有的可能性,直到我们得到正确的答案或耗尽可能性的空间。乍一看,这似乎是解决问题的一种非常愚蠢的方法。然而,令人惊讶的是,详尽枚举算法通常是解决问题的最实用方法。它们通常易于实现且易于理解。而且,在许多情况下,它们运行速度足够快,可以满足所有实际目的。删除或注释掉为调试而插入的 print 语句,然后重新插入该语句 ans= ans + 1。现在尝试查找1957816251的多维数据集根。该程序几乎会立即完成。现在,试试7406961012236344616。如您所见,即使需要数百万次猜测,运行时通常也不是问题。现代计算机的速度惊人。执行指令所需的时间不到一纳秒-十亿分之一秒。很难理解这有多快。对于透视,光传播一英尺(0.3米)需要略多于纳秒的时间。另一种思考方式是,在声音传播100英尺所需的时间内,现代计算机可以执行数百万条指令。

image.png

查看在打印结果之前有可察觉的暂停之前需要输入多大的整数。

让我们看一下穷举枚举的另一个示例:测试整数是否为质数,如果不是,则返回最小除数。素数是大于 1 的整数,只能被自身和 1 整除。例如,2、3、5 和 111,119 是素数,而 4、6、8 和 62,710,561 不是素数。

找出大于 3 的整数 x 是否为素数的最简单方法是将 x 除以 2 和 x-1 之间的每个整数。如果这些除法中的任何一个的余数是 o,则 x 不是素数,否则 x 是素数。图 3-2 中的代码实现了该方法。它首先要求用户输入一个整数,将返回的字符串转换为 int,然后将该整数分配给变量 x。然后,它通过将猜测初始化为 2 并将变量smallest_divisor为 None 来设置穷举枚举的初始条件-表示在证明不是这样之前,代码假定 x 是素数。

穷举枚举是在 for 循环中完成的。当尝试了 x 的所有可能的整数除数或发现一个整数是 x 的除数时,循环终止。

退出循环后,代码将检查smallest_divisor的值并打印相应的文本。在进入循环之前初始化变量,然后在退出时检查该值是否已更改的技巧很常见。