---
# System prepended metadata

title: 用Python解立方根
tags: [資訊科學教學法]

---

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