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,C语言的实现)以及相关习题巩固

    目录 栈 概念以及代码实现 例题 232. 用栈实现队列 1614. 括号的最大嵌套深度 234. 回文链表 1614. 括号的最大嵌套深度 LCR 123. 图书整理 I 206. 反转链表 402 ...

  2. Centos7安装Nginx教程,一步安装http和https

    nginx是一款轻量级web服务器,主要有负载均衡和反向代理的特性. 安装准备 nginx一些模块需要依赖lib库,所以先安装lib库,执行以下命令: [root@localhost local]# ...

  3. 用 Sentence Transformers v3 训练和微调嵌入模型

    Sentence Transformers 是一个 Python 库,用于使用和训练各种应用的嵌入模型,例如检索增强生成 (RAG).语义搜索.语义文本相似度.释义挖掘 (paraphrase min ...

  4. .net core .net6 webapi 连接mysql 8

    1.表结构: CREATE TABLE `table2` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `myname` varchar(255) NOT NULL, ...

  5. 什么是 SpringMvc?

    SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合.

  6. spark读取hive表,org.apache.spark.sql.AnalysisException: Unsupported data source type for direct query on files: hive;

    异常出现:spark读取hive表时,spark.read.table(hive.test) hdp版本的spark默认的catalog是spark,配置项 metastore.catalog.def ...

  7. 开源云同步的markdown写作软件——Yosoro

    文章目录 前言 简便的项目管理 舒服的写作体验 支持one driver 存在缺点 前言 Yosoro是一款支持在Win.Linux.macOS上使用的写作软件.它的界面设计以及交互上表达出的极简主义 ...

  8. 在Ubuntu 18.04 安装 adb

    Ubuntu下安装ADB 背景 电脑上的USB口有问题,不方便调试:发现用于开发的服务器就在工位旁边. 先拿过来用一下. Ubuntu:18.04 做法 安装adb 做法有很多种,列举下列2种. 下载 ...

  9. 全志A40i+Logos FPGA开发板(4核ARM Cortex-A7)硬件说明书(下)

    前 言 本文档主要介绍板卡硬件接口资源以及设计注意事项等内容,测试板卡为创龙科技旗下的全志A40i+Logos FPGA开发板. 核心板的ARM端和FPGA端的IO电平标准一般为3.3V,上拉电源一般 ...

  10. k8s实战 ---- pod 基础

    如果你对k8s还不了解,可以看下前文 k8s 实战 1 ---- 初识       (https://www.cnblogs.com/jilodream/p/18245222) 什么是pod,pod在 ...