1. 程式人生 > 其它 >對比python學julia(第二章)--(第一節)隔溝算樣—列舉策略

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