150 likes | 236 Views
函式 Function Part.2. 東海大學物理系 ‧ 資訊教育 施奇廷. 遞迴( Recursion ). 函式可以「呼叫自己」,這種動作稱為「遞迴」 此程式的執行結果相當於陷入無窮迴圈,無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以達到部分迴圈的效果. 範例:從 1 加到 N 之級數求和. 習題:階乘. 請寫作一程式,利用函式的遞迴呼叫,輸入整數 N 後,可以求其階乘值 N! 試問:在 N 大於多少時,會發生整數溢位( overflow )的現象?. Call by Value; Call by Address.
E N D
函式Function Part.2 東海大學物理系‧資訊教育 施奇廷
遞迴(Recursion) • 函式可以「呼叫自己」,這種動作稱為「遞迴」 • 此程式的執行結果相當於陷入無窮迴圈,無法停止(只能按 Ctrl-C) • 這給我們一個暗示:函式的遞迴呼叫可以達到部分迴圈的效果
習題:階乘 • 請寫作一程式,利用函式的遞迴呼叫,輸入整數 N 後,可以求其階乘值 N! 試問:在 N 大於多少時,會發生整數溢位(overflow)的現象?
Call by Value; Call by Address • 一般 C 的函式呼叫,傳送引數是採取 call by value 的方式,也就是把引數的「值」拷貝到函式中,函式裡面對這個變數的任何修改,並不會改變主函式(呼叫者)內該變數的值 • 若要透過被呼叫的函式修改這個變數在主函式中的值,必須採取 call by address 的方式
範例:Fibonacci數列 • 此數列是在中世紀時期由義大利有名的數學家 Fibonacci 所發表。他在 1202 年出版的『算盤書』中, 有一題『兔子問題』, 題目是這樣的:
Fibonacci 數列 • 根據題意我們可以假設月份為 Fn, 其值為兔子的總對數。由此推出一個數列: • 此數列就是 Fibonacci 數列, 其特性就是當n>2 時, 第 n 項的值就是前 2 項的和 (第 n-2 項加第 n-1 項)。
何謂 Call by Address? • 在第二個例子中,函數的引數是「位址」而不是「數值」:c=fibo(&a,&b); • 在變數a的前面加一個&符號:「&a」,這代表a這個變數在記憶體上的位置(位址) • 而在函數的定義中:int fibo(int *a, int *b)表示,a 與 b 是兩個記憶體的位址,在這個位址上儲存的變數是整數 • 在位址前面加一個星號「*a」表示該位址所儲存的變數的數值
作業:數值微分 • 作業:寫作一程式計算數值微分,利用一函數求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 時,數值微分所求出的值與精確微分值相差多少?