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. 关于ICMP隧道一点理解(起于修改wien-qq的记住密码)

    起 使用linux半年多以来,一直有一个我很需要但我无法完美解决的东西困扰这我-----(linux QQ) 目前我的解决方案是GitHub上的一个第三方QQ(有关ICMP隧道的搭建见 承,转) 但是 ...

  2. 面向对象编程 es5和es6的构造函数

     /*         面向对象编程                          本质 创建一个对象                  可以用 属性属性值的 方式 存储 数据参数         ...

  3. java并发编程——CompletableFuture

    简介 Java的java.util.concurrent包中提供了并发相关的接口和类,本文将重点介绍CompletableFuture并发操作类 JDK1.8新增CompletableFuture该类 ...

  4. java8 API 函数式接口

    简介 14年,Oracle公司如期发布了Java 8正式版,Java8提供了强大的流式处理及函数式接口编程 函数式接口编程,相信很多人在javascript中都使用过,比如回调函数,如今Java8也吸 ...

  5. webpack-bundle-analyzer 分析打包模块大小优化

    安装 webpack-bundle-analyzer npm i webpack-bundle-analyzer -D 配置vue.config.js module.exports = defineC ...

  6. SingletonKit单例源码阅读学习

    阅读学习QFramwork中的SingletonKit源码. Singleton 普通类的单例 作为最常用的单例模块,通过继承单例泛型类来实现,需要私有构造: //使用第一种接口单例方式 intern ...

  7. Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

    搜索界面使用Flutter自带的SearchDelegate组件实现,通过魔改实现如下效果: 搜素建议 搜索结果,支持刷新和加载更多 IOS中文输入拼音问题 界面预览 拷贝源码 将SearchDele ...

  8. Built-in COM has been disabled via a feature switch.

    .net 6.0 开始默认关闭com组件 使用时会出现以下信息 Built-in COM has been disabled via a feature switch. See https://aka ...

  9. Kubernetes(二)资源管理

    1. 资源管理介绍 在kubernetes中,所有内容都抽象为资源,用户需要操作资源来管理kubernetes. Kubernetes本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服 ...

  10. ARM 命名规则和ARM 版本

    结论:我们所接触到提到的命名规则,应该分成两类. 基于ARM Architecture版本的"指令集架构"命名规则:例如armv6, armv7, armv7s, arm64 等系 ...