15
函函 Function Part.2 函函函函函函函‧函函函函 函函函

函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

  • View
    226

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

函式 Function Part.2

東海大學物理系‧資訊教育施奇廷

Page 2: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

遞迴( Recursion )

函式可以「呼叫自己」,這種動作稱為「遞迴」

此程式的執行結果相當於陷入無窮迴圈,無法停止(只能按 Ctrl-C )

這給我們一個暗示:函式的遞迴呼叫可以達到部分迴圈的效果

Page 3: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

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

Page 4: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

習題:階乘

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

Page 5: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

Call by Value; Call by Address

一般 C 的函式呼叫,傳送引數是採取 call by value 的方式,也就是把引數的「值」拷貝到函式中,函式裡面對這個變數的任何修改,並不會改變主函式(呼叫者)內該變數的值

若要透過被呼叫的函式修改這個變數在主函式中的值,必須採取 call by address 的方式

Page 6: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

範例: Fibonacci 數列

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

Page 7: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

Fibonacci 數列

根據題意我們可以假設月份為 Fn, 其值為兔子的總對數。由此推出一個數列:

此數列就是 Fibonacci 數列 , 其特性就是當 n>2 時 , 第 n 項的值就是前 2 項的和 ( 第 n-2 項加第 n-1 項 ) 。

Page 8: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

Call by Value 之例 : Fibonacci 數列

執行結

Page 9: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

Call by Address 之例 : Fibonacci 數列

執行結

Page 10: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

兩種呼叫方式之比較

Page 11: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

何謂 Call by Address?

在第二個例子中,函數的引數是「位址」而不是「數值」: c=fibo(&a,&b);

在變數 a 的前面加一個 & 符號:「 &a 」,這代表 a 這個變數在記憶體上的位置(位址)

而在函數的定義中: int fibo(int *a, int *b) 表示, a 與 b 是兩個記憶體的位址,在這個位址上儲存的變數是整數

在位址前面加一個星號「 *a 」表示該位址所儲存的變數的數值

Page 12: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

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

Page 13: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

求出 Fibonacci 數列某項的值

Page 14: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

執行結果

Page 15: 函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈,

作業:數值微分

作業:寫作一程式計算數值微分,利用一函數求 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 時,數值微分所求出的值與精確微分值相差多少?