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