<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: `資訊科學教學法`