對比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)

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