1 / 15

函式 Function Part.2

函式 Function Part.2. 東海大學物理系 ‧ 資訊教育 施奇廷. 遞迴( Recursion ). 函式可以「呼叫自己」,這種動作稱為「遞迴」 此程式的執行結果相當於陷入無窮迴圈,無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以達到部分迴圈的效果. 範例:從 1 加到 N 之級數求和. 習題:階乘. 請寫作一程式,利用函式的遞迴呼叫,輸入整數 N 後,可以求其階乘值 N! 試問:在 N 大於多少時,會發生整數溢位( overflow )的現象?. Call by Value; Call by Address.

katy
Download Presentation

函式 Function Part.2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 函式Function Part.2 東海大學物理系‧資訊教育 施奇廷

  2. 遞迴(Recursion) • 函式可以「呼叫自己」,這種動作稱為「遞迴」 • 此程式的執行結果相當於陷入無窮迴圈,無法停止(只能按 Ctrl-C) • 這給我們一個暗示:函式的遞迴呼叫可以達到部分迴圈的效果

  3. 範例:從 1 加到 N 之級數求和

  4. 習題:階乘 • 請寫作一程式,利用函式的遞迴呼叫,輸入整數 N 後,可以求其階乘值 N! 試問:在 N 大於多少時,會發生整數溢位(overflow)的現象?

  5. Call by Value; Call by Address • 一般 C 的函式呼叫,傳送引數是採取 call by value 的方式,也就是把引數的「值」拷貝到函式中,函式裡面對這個變數的任何修改,並不會改變主函式(呼叫者)內該變數的值 • 若要透過被呼叫的函式修改這個變數在主函式中的值,必須採取 call by address 的方式

  6. 範例:Fibonacci數列 • 此數列是在中世紀時期由義大利有名的數學家 Fibonacci 所發表。他在 1202 年出版的『算盤書』中, 有一題『兔子問題』, 題目是這樣的:

  7. Fibonacci 數列 • 根據題意我們可以假設月份為 Fn, 其值為兔子的總對數。由此推出一個數列: • 此數列就是 Fibonacci 數列, 其特性就是當n>2 時, 第 n 項的值就是前 2 項的和 (第 n-2 項加第 n-1 項)。

  8. Call by Value 之例: Fibonacci 數列 執行結果

  9. Call by Address 之例: Fibonacci 數列 執行結果

  10. 兩種呼叫方式之比較

  11. 何謂 Call by Address? • 在第二個例子中,函數的引數是「位址」而不是「數值」:c=fibo(&a,&b); • 在變數a的前面加一個&符號:「&a」,這代表a這個變數在記憶體上的位置(位址) • 而在函數的定義中:int fibo(int *a, int *b)表示,a 與 b 是兩個記憶體的位址,在這個位址上儲存的變數是整數 • 在位址前面加一個星號「*a」表示該位址所儲存的變數的數值

  12. 以遞迴呼叫函數方式求 Fibonacci 數列某項的值

  13. 求出 Fibonacci 數列某項的值

  14. 執行結果

  15. 作業:數值微分 • 作業:寫作一程式計算數值微分,利用一函數求f(x)=3x2+exp(x2+2x)之數值微分[f(x+h)-f(x)]/h。另一函數求此函數微分之精確值 df(x)/dx = 6x+exp(x2+2x)‧(2x+2)。給定 x=1, h = 0.01, 0.0001, 0.000001, 0.00000001 時,數值微分所求出的值與精確微分值相差多少?

More Related