对比python学julia(第二章)--(第一节)隔沟算样—枚举策略
1.1. 问题描述
在明代数学家程大位的《算法统宗》著作中记载了这样一道数学题:
甲乙隔沟放牧,二人暗里参详。
甲云得乙九个羊,多你一倍之上。
乙说得甲九只,两家之数相当。
两边闲坐恼心肠,画地算了半晌。
这道古算题以词牌“西江月”填词,用现代语言描述就是:
甲、乙牧人隔着山沟放羊,两人心里都在想对方有多少只羊。甲对乙说:我若得你9只羊,我的羊就多你一倍。”乙说:“我若得你9只羊,我们两家的羊数就相等。山沟两边,心里烦恼,各自在地上列算式计算了半天才知道对方的羊数。
请编写一个程序,算一算甲、乙各有几只羊?
1.2. 算法分析
根据甲、乙的对话内容,分析其中的数量关系,尝试列出等式方程。在这个问题中有两个未知数,所以设甲有x只羊,乙有y只羊。根据甲说的话,如果甲得到乙的9只羊,那么甲的羊就是乙的一倍。由此得到一个等量关系:
x+9=2(y-9)
根据乙说的话,如果乙得到甲的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)