算法学习(12)数学问题求解系列(9)求最大公约数(递归和非递归解法)

致谢

小小庆祝下哈,从2019.3.18 注册博客,到今天4.13,我终于实现了博客排名前100万的小目标啦~ 谢谢各位朋友们的支持,爱你们哦 ~ 不过呢,这只是一个新的起点,通过写博客,不断总结提升自己,才是最重要的目标啊!不忘初心,放得始终!

前言

这一期的内容,求最大公约数,内容相对简单,刚好可以让我从昨天的长文缓一缓。

问题

求给定两个整数的最大公约数

名词解释

公约数,就是能同时整除给定两个数字的最大整数,如 15 15 15 10 10 10的最大公约数是 5 5 5

欧几里得算法

求解最大公约数,常用的是欧几里得算法(在我们数学教材中叫辗转相除法),算法思路如下:

  1. 对于已知的数 m m m n n n, 假设 m > n m>n m>n
  2. m m m 除以 n n n 得余数 r r r
  3. r = 0 r=0 r=0, 则 n n n 就是求得的最大公约数, 结束;如果 r ≠ 0 r \neq 0 r̸=0, 则执行第4步
  4. n n n 的值保存到 m m m 中,将 r r r 的值保存到 n n n 中,重复执行步骤2和3

编程思路

算法很简单直白,所以跟着算法一步步写程序即可

实现代码

使用递归,欧几里得本身就是不断重复某些步骤,很适合。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2019-04-08 17:39:01
# @Author  : Promise ([email protected])
# @Link    : ${link}
# @Version : $Id$

import time


# 先使用欧几里得的方法,求最大公约数,递归算法
def FindGCD(a_big, b_small):
    if a_big % b_small == 0:
        print('最大公约数是:', b_small)
    else:
        FindGCD(b_small, a_big % b_small)

运行效果

递归算法
第一个输出。

代码分析

  1. 注意检查输入,一定要确保大的数除以小的数,这里只是因为编程练习,就忽略了输入检查。现实应用,检测输入是很关键的一环
  2. 递归程序一定要有停止递归的终点,这里是 if a_big % b_small == 0:
  3. 理解为什么 b_small 一定大于 (a_big % b_small)

不使用递归,所有递归都能用循环来实现

# 尝试非递归
def FindGCD2(a_big, b_small):
    while a_big % b_small:
        t = a_big
        a_big = b_small
        b_small = t % b_small
    # 跳出循环,也就求得了最大公约数
    print('最大公约数是:', b_small)

运行效果

递归算法
第二个输出。

代码分析

  1. 同意注意输入检查
  2. 循环终止条件和递归终止条件是一样的,这里用于while循环的终止,while a_big % b_small:
  3. 继续理解为什么 b_small 一定大于 (a_big % b_small) (想不明白可以评论问我~

总结

这种类型的编程是很简单的,有明确易理解的算法,不需要靠考虑复杂度,不过,用这些程序,检验自己能否熟练编程,也是一个不错的选择啊。

你可能感兴趣的:(学习札记,基于Pyhton的算法实现)