对比python学julia(第二章)--(第一节)隔沟算样—枚举策略

1.1.  问题描述

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

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

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

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

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

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

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

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

1.2.  算法分析

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

  x+9=2(y-9)

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

  y+9=x-9

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

{x+9=2×(y9)y+9=x9

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

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

     解题的流程图如下:

 

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章