1.1.  问题描述

在明代数学家程大位的《算法统宗》著作中记载了这样一道数学题:

甲乙隔沟放牧,二人暗里参详。

甲云得乙九个羊,多你一倍之上。

乙说得甲九只,两家之数相当。

两边闲坐恼心肠,画地算了半晌。

这道古算题以词牌“西江月”填词,用现代语言描述就是:

甲、乙牧人隔着山沟放羊,两人心里都在想对方有多少只羊。甲对乙说:我若得你9只羊,我的羊就多你一倍。”乙说:“我若得你9只羊,我们两家的羊数就相等。山沟两边,心里烦恼,各自在地上列算式计算了半天才知道对方的羊数。

请编写一个程序,算一算甲、乙各有几只羊?

1.2.  算法分析

根据甲、乙的对话内容,分析其中的数量关系,尝试列出等式方程。在这个问题中有两个未知数,所以设甲有x只羊,乙有y只羊。根据甲说的话,如果甲得到乙的9只羊,那么甲的羊就是乙的一倍。由此得到一个等量关系:

  x+9=2(y-9)

根据乙说的话,如果乙得到甲的9只羊,那么乙的羊就和甲的相等。由此又得到一个等量关系:

  y+9=x-9

将这两个等式方程综合起来,就得到一个二元一次方程组:

{x+9=2×(y−9)y+9=x−9

原书作者考虑到面向的读者多为小学生,而小学即使到高年级也只学了一元一次方程,所以采用了枚举法来解这个二元一次方程。

所谓枚举法,又称为穷举法,它是将解决问题的可能方案全部列举出来,并逐一验证每种方案是否满足给定的检验条件,直到找出问题的解。编程时通常使用循环结构和判断语句来实现枚举算法。

解题的流程图如下:

1.3.  编程解题

打开VSCode,新建一个ggsy.py文件,输入以下代码:

 1 '''
2 程序:隔沟算羊,用枚举法求解方程问题
3 作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 '''
6 def main():
7 '''求解隔沟算羊问题'''
8 x = 1
9 while True:
10 y = x - 18
11 if x + 9 == 2 * (y - 9):
12 print(x, y)
13 break
14 else:
15 x = x + 1
16
17 if __name__ == '__main__':
18 main()

将以上代码保存后,运行结果如下

>>>======== RESTART: F:\work\me\python学习\python\隔沟算羊.py =========
     63 45

以上就是Python的代码,比较简单。其实julia代码也差不多:

 1 function main()
2 #求解隔沟算样问题
3 x=1
4 while true
5 y=x-18
6 if x+9==2*(y-9)
7 print("x=",x," y=",y)
8 break
9 else
10 x=x+1
11 end
12 end
13 end
14 main()

Julia代码和python代码几乎一毛一样!

建议在VSCode中安装插件“Code Runner”。这个插件支持市面上绝大多数编程语言,使用也很方便,安装后,在代码文件上点击右键,在右键菜单上点击“Run code”就可以。不过要注意,这个插件不适合运行需要接收控制台输入的代码。

  • 扩展阅读

作为在科学计算方面拥有自身优势的python和Julia,    对于解方程用穷举法就显得太low了点。python用于数学计算的库很多,这里我们使用“sympy”库。随便说一下,python的库如何安装和使用。

打开一个cmd窗口,使用pip命令安装“sympy”库,输入以下命令:

pip3 install sympy

成功安装后,可以用下面的方式使用这个库

  from sympy import *

  或者

  import sympy

  最终代码是这样的:

1 # 导入sympy
2 from sympy import *
3 # import sympy
4 x,y=symbols("x y")
5 a=sympy.solve([x+9-2*(y-9),x-9-y-9],[x,y])
6 print(a)

  这样就简单多了。那么julia是不是也可以照抄?答案是肯定的。Julia中库的安装是用Pkg命令来实现的,Pkg安装库的方式一般是这样的:

  julia> import Pkg

  julia> Pkg.add("库名称")

  至于julia如何安装sympy库,可以参考以下链接:

https://github.com/JuliaPy/SymPy.jl

https://juliapackages.com/p/sympy

  注意sympy库实际上是一个python库,而julia是可以调用python库的,实际上它是通过“PyCall”这个接口实现的,所以,要在julia中使用sympy,前提是已经安装了python,并且通过pip命令安装了sympy库。

  另外,还可以用更笨的方法,直接在julia环境的命令行输入“using SymPy”(注意字母大小写),然后跟着提示一路安装就可以了,只要你英语足够好,中间遇到的问题都可以根据提示解决:

  安装成功后,可以在julia中,使用using命令调用。

  整个代码如下:

using SymPy
x,y=symbols("x y")
a=sympy.solve([x+9-2*(y-9),x-9-y-9],[x,y])
print(a)

  运行后得到如下结果:

  Dict{Any, Any}(x => 63, y => 45)

对比python学julia(第二章)--(第一节)隔沟算样—枚举策略的更多相关文章

  1. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  2. tensorflow2.0学习笔记第二章第一节

    2.1预备知识 # 条件判断tf.where(条件语句,真返回A,假返回B) import tensorflow as tf a = tf.constant([1,2,3,1,1]) b = tf.c ...

  3. 《零压力学Python》 之 第二章知识点归纳

    第二章(数字)知识点归纳 要生成非常大的数字,最简单的办法是使用幂运算符,它由两个星号( ** )组成. 如: 在Python中,整数是绝对精确的,这意味着不管它多大,加上1后都将得到一个新的值.你将 ...

  4. 《python可以这样学》第二章

    Python序列 列表与列表推导式 列表创建与删除 创建列表对象 >>> a_list = list((3, 5, 7, 9, 11)) >>> a_list = ...

  5. 路飞学城-Python爬虫集训-第二章

    本次爬虫集训的第二次作业是web微信. 先贴一下任务: 作业中使用到了Flask. Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模 ...

  6. 《数据结构与算法Python语言描述》习题第二章第一题(python版)

    题目:定义一个表示时间的类Timea)Time(hours,minutes,seconds)创建一个时间对象:b)t.hours(),t.minutes(),t.seconds()分别返回时间对象t的 ...

  7. python基础教程第二版 第一章

    1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...

  8. python基础教程-第二章-列表和元组

    本章将引入一个新的概念,:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在 一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在python中,最基本的数据结构 ...

  9. Python开发【第二章】:Python模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

  10. Python开发【第二章】:模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

随机推荐

  1. Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?

    在 Java 中,hashCode 和 equals 方法都是 Object 类的方法.它们的作用分别如下: hashCode 方法返回对象的哈希码,用于支持基于哈希表的集合,如 HashMap.Ha ...

  2. 【Java面试题-基础知识03】Java线程连环问

    1.Java中的线程是什么? 在Java中,线程是程序执行流的最小单元.每个Java程序都至少有一个主线程,也称为主执行线程,它是程序开始执行时自动创建的.除了主线程外,程序员还可以创建额外的线程来执 ...

  3. INFINI Gateway 与华为鲲鹏完成产品兼容互认证

    何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...

  4. mysql8 windows 数据库名 表名 大小写

    由于Apollo的SQL 脚本是大小写的.mysql8 默认又是纯小写的. 解决方法: 方法1.卸载MYSQL,重新安装MYSQL时,高级选项中指定区分大写小.这种会清空所有库和数据.不建议. 方法2 ...

  5. C#.NET AES ECB 加密

    加密: /// <summary> /// 加密 /// </summary> /// <param name="content">要加密的串& ...

  6. Kubernetes监控手册06-监控APIServer

    写在前面 如果是用的公有云托管的 Kubernetes 集群,控制面的组件都交由云厂商托管的,那作为客户的我们就省事了,基本不用操心 APIServer 的运维.个人也推荐使用云厂商这个服务,毕竟 K ...

  7. GIS数据获取:土地利用与土壤属性、DEM、水体水系数据

      本文对目前主要的土壤属性.地表覆盖.数字高程模型与水体水系矢量数据获取网站加以整理与介绍.   本文为"GIS数据获取整理"专栏中第三篇独立博客,因此本文全部标题均由" ...

  8. .Net Core 访问 appsettings.json

    1.添加 NuGet 包 Microsoft.Extensions.Configuration 2.通过注入获取 Configuration 注意:注入获取的必须提前在 StartUp 里面提前注册 ...

  9. springboot 访问url 报404

    使用Springboot 写了一个后端服务,通过 postman 测试接口时,发现一直 404 (message: No message available) 把springboot 从启动 到 da ...

  10. BigDecimal加减乘除、比较

    // 加 a+b a.add(b); // 减 a-b a.subtract(b); // 乘 a*b a.multiply(b); // 除 a/b a.divide(b); // 绝对值 a.ab ...