<style> .reveal, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-family: -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Helvetica, Arial, PingFangTC-Light, "Microsoft JhengHei", "微軟正黑", sans-serif, "Apple Color Emoji" } </style> # 用Python解立方根 ## 前言 電腦,其實很笨,必須要人類明確的告訴它怎麼做,才能把事情做好。 但是電腦有一個很大的優點,就是可以快速重覆做無聊的事,所以只要把程式寫好,電腦可以很快的把事情做好。 今天,我們就來想想看,怎麼教電腦算立方根。 --- ## 手算怎麼解立方根 請問8的立方根是多少? $\sqrt[3]{8} = ?$ 答案很簡單,就是2。因為 $2 \times 2 \times 2 = 8$ 再請問15的立方根是多少? $\sqrt[3]{15} = ?$ 好像就沒那麼簡單了。 想想看,你是怎麼算的? 1.找出最接近15而不超過15的整數立方根 :::info $1 \times 1 \times 1 = 1$ <span><!-- .element: class="fragment highlight-blue" -->$2 \times 2 \times 2 = 8$</span> $3 \times 3 \times 3 = 27$ ::: 2.一次加0.1,加到3次方最接近15而不超過15的數字 :::info $2.1 \times 2.1 \times 2.1 = 09.261$ $2.2 \times 2.2 \times 2.2 = 10.648$ $2.3 \times 2.3 \times 2.3 = 12.167$ <span><!-- .element: class="fragment highlight-blue" -->$2.4 \times 2.4 \times 2.4 = 13.824$</span> $2.5 \times 2.5 \times 2.5 = 15.625$ ::: 3.接著繼續加下去,可以找出愈來愈接近15的立方根。 4.試著算到小數點後第四位。 --- ## 找出規則 想想看,我們剛剛做的事,有沒有什麼規律,或是重覆的動作? - 從1開始往上加,算出3次方,一直算到接近15但小於15。 - 把剛剛的數字每次加0.1,算出3次方,一直算到接近15但小於15。 - 把剛剛的數字每次加0.01,算出3次方,一直算到接近15但小於15。 - ...一直做下去。 找出來了嗎?接下來,我們就是要把這重覆的動作教給電腦,讓電腦幫我們做些重覆又單調的工作。 --- ## 用Python來實作 首先,我們要進入Google Colab,如果忘記怎麼進去的話,請參考 **[Python環境建置](https://hackmd.io/@JasonChang/homework1)**。 在這個例子中,我們會用到while指令,while指令的功用,就是讓電腦重覆做一樣的工作,直到符合條件才能結束。 :::info :bulb: **指令格式** while (判斷式): ←[要加冒號]   執行程式 ←[要縮排] ::: 試試看下列程式,看看執行結果如何? ```python= count=1 while (count <=20): print(count) count=count+1 ``` 可以說出這支程式執行的流程嗎? --- 接下來,我們可以試著用 while 指令來解立方根。 ```python= i = 0.0 while (i*i*i <15): i = i + 0.0001 print (i) ``` 想想看,這樣寫有什麼缺點嗎? --- 可不可以改進這支程式,讓他也可以解其他數字呢? 用input指令來輸入其它數字 ```python= i=float(input("輸入一個正整數")) j=0.0 while (j*j*j <i): j = j + 0.0001 print (j) ``` 驗算看看,答案正確嗎? --- 因為精確度有限的關係,小數點後面最後的數字會出現問題,但我們目前不需要求到那麼高的準確度,所以眼不見為淨,可以設定print格式,顯示到小數點後第四位就好。 ```python= i=float(input("輸入一個數字")) j=0.0 while (j*j*j <i): j = j + 0.0001 print ('%8.5f' %(j)) ``` 這樣就夠好了嗎?試著輸入大一點的數字看看 111、1111、11111、12個1呢? 是不是發現要跑很久,老師不是說電腦很快嗎?為什麼要算那麼久? 電腦運算數度雖然快,但仔細想想,這麼大的數字,電腦要跑幾次迴圈才能算出答案? 所以我們還是要幫電腦想想看,有沒有辦法算快一點?想一下剛剛我們怎麼算的?你會一次加0.0001,慢慢加上去嗎?當然不會,對吧?所以我們用了什麼偷吃步的方法?請你試著教電腦做看看。 --- 這裡有一個範例 ```python= i=float(input("輸入一個數字")) j=0.0 while (j*j*j <i): j = j + 1 while (j*j*j <i): j = j + 0.1 while (j*j*j <i): j = j + 0.01 while (j*j*j <i): j = j + 0.001 while (j*j*j <i): j = j + 0.0001 print ('%8.5f' %(j)) ``` 試看看,答案正確嗎? --- ## 回家作業 - 想想看,問題出在哪裡? - 請修改出正確的程式 ###### tags: `資訊科學教學法`