一边学Python,一边学算法

不带着问题去学习永远是没有什么成就的。

于是为了更好的学习Python,我还是决定开始看算法的研究书,然后用Python来实现这些算法。在学习算法的同时巩固Python的知识。

今天看的是《计算机程序设计艺术》第一卷,用Python验算了欧几里得的求最大公约数的算法

算法的描述是:

有数m和n,求它的公约数的方法是:

1.找到m和n之间的最大数,求它们的余数
2.如果余数为0,则其中较小的那个数即为所求
3.如果余数不为0,则将较大的数置为较小的那个数值,将较小的那个数值置为1中产生的余数,继续进行步骤1

于是产生的程序如下(Python3):
__author__ = 'Siglud'
# -*- coding: utf-8 -*-

def find_greatest_common_divisor(x, y):
    '''查找最大公约数函数

    根据计算机程序设计艺术中第一节的算法来求最大公约数'''
    temp = x > y and x%y or y%x
    if temp == 0:
        return x > y and y or x
    else:
        if (x > y):
            return find_greatest_common_divisor(y,temp)#此处一定要有Return,否则还会执行一轮
        else:
            return find_greatest_common_divisor(x,temp)

x = input("请输入x的值:")
y = input("请输入y的值:")

print(find_greatest_common_divisor(int(x),int(y)))

值得注意的是以下几点:

  1. 如果要在Python的程序中使用中文,记得加注释:# -*- coding: utf-8 -*- ,这样才能顺利的进行调试。
  2. 在递归的调用中记得一定要用return调用下一轮的函数,否则最后还会执行一轮,这样产生的数据就是错误的了。
  3. x and y or c 是Python的三元运算符。
  4. Python的强制类型转换方式和Java不同。
  5. 这个算法很粗略,没有考虑到用户输入不符合规范的可能性。

评论

此博客中的热门博文

转一下关于Fuck的用法

远程记录OpenWRT日志

用OpenWRT打造自动翻墙路由器(详解篇)