Transcript Document

程式設計-使用Visual Basic 2010
第11章
自訂函式與遞迴
函式(Function)
 函式用於結構化程式,程式設計師可將相同功能的程
式獨立出來,經由函式的呼叫,傳入資料與回傳資料
處理後的結果,當程式設計師將函式寫好,就可以不
斷利用此函式做相同動作,達成程式碼不重複。如果
需要修改此功能,只要更改此函式即可。
 再者,其他程式設計師要使用此函式,只要知道此函
式的功能,什麼輸入會有怎樣對應的輸出,不需知道
函式實作的細節。
 函式可幫助多位程式設計師共同開發系統,事先規劃
函式名稱與功能,再各自開發函式與整合所有程式,
最後達成系統所需求的功能。
函式的定義、傳回值與呼叫
 函式的定義與傳回值
 函式的定義為函式的實作細節,實作函式功能的程式碼皆置於
此,函式的定義在Function與End Function所包夾起來,函式
結束可能需要回傳值,回傳值的方法有兩種,如下表。
函式的呼叫
 程式經由函式呼叫,將資料傳入函式,函式處理後將結
果傳回給呼叫程式,程式中要如何呼叫函式?

變數 = 函式名稱(參數值1,參數值2,…)
 等號右邊要先做完,利用函式名稱與參數來呼叫函式,
最後函式回傳值給變數,變數就記錄函式處理的結果。
計算長方形面積
 以下範例用於計算長方形面積, 使用者輸入長度與寬
度, 呼叫自訂的computeArea函式將長度與寬度傳入
,計算後回傳結果。
計算長方形面積
 解說
 第2行:呼叫computeArea函式,以TextBox1與TextBox2分別為
computeArea函式的輸入參數,輸出結果顯示在TextBox3,函
式呼叫時程式執行控制權由Button1_Click轉到computeArea函
式。
 第4到6行:定義函式computeArea,輸入的參數分別儲存在變
數length與wide,本範例中TextBox1的輸入儲存在length,而
TextBox2的輸入儲存在wide。
 第5行:回傳變數length與變數wide相乘的結果,將程式執行的
控制權由函式computeArea轉換到Button1_Click函式。
函式呼叫執行過程


(1)當按下Button1 時驅動Button1_Click 事件函式, 執行過程中
遇到呼叫c omputeArea函式,以TextBox1與TextBox2為輸入,此
時程式執行控制權由Button1_Click事件函式轉到computeArea函
式
(2)computeArea函式執行過程中遇到Return將值回傳,此時程式
執行控制權由computeArea函式轉回Button1_Click事件函式。
函式的傳值呼叫(ByVal)與傳址呼叫(ByRef)
 在VB中,參數的傳遞可以使用傳值呼叫(ByVal)或傳
址呼叫(ByRef)。傳值呼叫(ByVal)是將值傳入函式;
而傳址呼叫(ByRef)是將位址傳入函式。以下舉例說明
這兩者的差異。
 傳值呼叫
傳值呼叫
 解說
 第2行:Dim a As Integer = 10,宣告變數a為整數,且初始化為
10。電腦的運算結果暫存在記憶體,使用位址存取記憶體內容,
所以變數a實際上是代表一個記憶體空間,這個記憶體空間也有位
址,如下圖。變數a記憶體位置為0×1255,儲存的整數值為10。

第3行:呼叫increaseByVal函式,將值(10)當參數傳入
increaseByVal函式。
傳值呼叫

第6到9行:此時程式執行increaseByVal函式,變數x值設定成10
,因使用傳值呼叫,所以x與a屬於不同記憶體位置,如下圖。

將x值加1,x等於11,回傳x。

但因為是要印出變數a的值,實際上是沒有改變,還是10。
傳址呼叫
傳址呼叫
 解說
 第2行:Dim a As Integer = 10,宣告變數a為整數,且初始化為
10。電腦的運算結果暫存在記憶體,使用位址存取記憶體內容,
所以變數a實際上是代表一個記憶體空間,這個記憶體空間也有位
址,如下圖。變數a記憶體位置為0×1255,儲存的整數值為10。

第3行:呼叫increaseByRef函式,將值(10)當參數傳入
increaseByRef函式。
傳址呼叫

第6到9行:此時程式執行increaseByRef函式變數x值設定成10
,因使用傳址呼叫,所以x與a屬於相同記憶體位置,如下圖。

將x值加1,x等於11,回傳x。

印出變數a的值,a的值改變成11。
變數作用範圍
 變數作用範圍分成區塊範圍(Block scope)、函式範圍
(Procedure scope)、模組範圍(Module scope)等。區
塊範圍最小、函式範圍次之、而模組範圍最大。
變數作用範圍
 以下舉例說明區塊範圍(Block scope)、函式範圍
(Procedure scope)、模組範圍(Module scope)。
程式執行結果
intFor=1
intFor=2
intFor=3
intFor=4
intFor=5
intFor=6
intFor=7
intFor=8
intFor=9
intFor=10
intModule=55
intModule=155
變數作用範圍
 解說
 第2行:宣告intModule為整數變數,其位置在副程式(Sub)與函
式(Function)外,所以為模組變數,作用範圍為整個Class(第1
行到第17行)。
 第4行:宣告intFor為整數變數,其位置在For迴圈內,所以為
區塊變數,作用範圍為For迴圈內(第4行到第7行)。
 第8行:於TextBox1顯示intModule值。
 第9行:呼叫AddOneHundred函式。
 第11到16行:宣告intFunc為整數變數並初始化為100,其位置
在函式(Func)內,所以為函式變數,作用範圍為
AddOneHundred函式內(第11行到第16行)。將intModul e加上
intFunc結果儲存在intModul e (第13行),顯示intModul e於
TextBox1。
計算BMI(
ch11\計算BMI\)
 自訂BMI函式,輸入體重與身高,回傳BMI值。
 想一想
 BMI常用來判斷肥胖程度,BMI等於體重(KG)除以身高(M)的
平方,「BMI與肥胖分級標準」表如下。請寫一程式讓使用者
輸入身高與體重,顯示BMI值與肥胖程度。
計算BMI(
ch11\計算BMI\)
 演算法說明
 我們利用自訂BMI函式,輸入體重與身高回傳BMI值,利用BMI值
與「BMI與肥胖分級標準」表,顯示對應的肥胖分級。
 預覽結果

請輸入體重為「80」與身高為「1.68」,點選「計算BMI」,則
顯示計算所得BMI值為「28.344」與肥胖分級為「體重肥胖」。
計算BMI(
 表單配置
在表單中新增四個TextBox
,四個Label與一個Button。
 屬性設定
物件
Label1
Label2
Label3
Label4
Button1
屬性
Text
Text
Text
Text
Text
設定值
體重 (KG)
身高 (M)
BMI
肥胖分級
計算 BMI
ch11\計算BMI\)
計算BMI(
ch11\計算BMI\)
 程式碼新增與解說
 點選「計算BMI」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
1
2
3
4
5
6
7
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim dbBMI As Double
Dim dbWeight As Double = Val(TextBox1.Text)
Dim dbHeight As Double = Val(TextBox2.Text)
dbBMI = BMI(dbWeight, dbHeight)
TextBox3.Text = dbBMI
計算BMI(
ch11\計算BMI\)
行號 程式碼
8
If dbBMI < 18 Then
9
TextBox4.Text = "體重過輕"
10
ElseIf dbBMI < 24 Then
11
TextBox4.Text = "體重正常"
12
ElseIf dbBMI < 27 Then
13
TextBox4.Text = "體重過重"
14
Else : TextBox4.Text = "體重肥胖"
15
End If
16
End Sub
17
Function BMI(ByVal weight As Double, ByVal height As Double) As Double
18
Dim dbBMI2 As Double
19
dbBMI2 = weight / height ^ 2
20
Return dbBMI2
21
End Function
22 End Class
計算BMI(
ch11\計算BMI\)
 解說
 第3行:宣告dbBMI為倍精度浮點數變數。
 第4行:宣告dbWeight為倍精度浮點數變數,並初始化為體重輸入
值。
 第5行:宣告dbHeight為倍精度浮點數變數,並初始化為身高輸入
值。。
 第6行:使用BMI函式計算所得BMI值,儲存到dbBMI變數中。
 第7行:將dbBMI值顯示在TextBox3。
 第8到9行:判斷所計算出的BMI值是否小於18,若是,則顯示「體
重過輕」。
 第10到11行:否則,判斷所計算出的BMI值是否小於24(隱含BMI
值大於等於18),若是,則顯示「體重正常」。
計算BMI(
ch11\計算BMI\)
 解說
 第12到13行:否則,判斷所計算出的BMI值是否小於27(隱含
BMI值大於等於24),若是,則顯示「體重過重」。
 第14行:否則,(隱含BMI值大於等於27)顯示「體重肥胖」。
 第17到21行:使用BMI函式,使用體重與身高為輸入值,輸出
BMI值。體重置於weight變數,身高置於height變數,使用「
weight / height ^ 2」計算BMI值,儲存到dbBMI2(第19行),
回傳dbBMI2(BMI值)(第20行)。
求質數(
ch11\求質數\)
 某數的因數只有1與自己,沒有其他因數,稱為質數
,寫一程式列出1到100所有質數。自訂判斷輸入是否
為質數的函式。輸入一數,回傳是否為質數,回傳1
表示為質數,回傳0表示為非質數。
 預覽結果
按下「列出質數」按鈕
,結果顯示在TextBox1中。
求質數(
 表單配置
在表單中新增一個
TextBox與一個Button。
 屬性設定
物件
TextBox1
TextBox1
TextBox1
Button1
屬性
ScrollBar
Multiline
Size
Text
設定值
Both
True
270,215
列出質數
ch11\求質數\)
求質數(
ch11\求質數\)
 程式碼新增與解說
 點選「列出質數」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
1 Public Class Form1
2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
3
For i As Integer = 2 To 100
4
If (isPrime(i) = 1) Then
5
TextBox1.Text = TextBox1.Text & i & "是質數" & vbNewLine
6
End If
7
Next
8
End Sub
求質數(
ch11\求質數\)
行號程式碼
9
Function isPrime(ByVal num As Integer) As Integer
10
Dim i As Integer = 2
11
Dim Flag As Integer = 1
12
Do While ((Flag = 1) And (i < num))
13
If ((num Mod i) = 0) Then
14
Flag = 0
15
End If
16
i=i+1
17
Loop
18
Return Flag
19
End Function
20 End Class
求質數(
ch11\求質數\)
 解說
 第3到7行:迴圈變數i,其值變化由2到100。自訂isPrime函式
,isPrime函式輸入值為迴圈變數i,若i為質數,isPrime函式回
傳1;否則回傳0。使用If結構判斷isPrime函式是否回傳1,若是
,則顯示「i為質數」(第4到6行),i值會隨著迴圈變化。
 第9到19行:自訂isPrime函式,以num為輸入,若num為質數
,回傳1;若num不為質數,回傳0。
 第10行:i為整數變數,用於While迴圈,變數i依序指向所有小
於輸入值的數,初始值為2。
求質數(
ch11\求質數\)
 解說
 第11行:Flag為整數旗標變數,若䂫 為1表示為質數;若為0表
示不是質數。預設為1,表示所有數先視為質數。
 第12~17行:當Flag為1且變數i小於函式輸入值num(第12行),
繼續測試變數i是否可以整除函式輸入值num(第13行),若變數i
可以整除輸入值num,則變數i為輸入值num的因數,設定Flag
為0,輸入值num為非質數(第14行),變數i值加1(第16行),重
複While迴圈回到第12行(第17行)。
 第18行:回傳變數Flag。
求質數(
ch11\求質數\)
 解說
 第11行:Flag為整數旗標變數,若䂫 為1表示為質數;若為0表
示不是質數。預設為1,表示所有數先視為質數。
 第12~17行:當Flag為1且變數i小於函式輸入值num(第12行),
繼續測試變數i是否可以整除函式輸入值num(第13行),若變數i
可以整除輸入值num,則變數i為輸入值num的因數,設定Flag
為0,輸入值num為非質數(第14行),變數i值加1(第16行),重
複While迴圈回到第12行(第17行)。
 第18行:回傳變數Flag。
遞迴
 遞迴是有趣的程式設計技巧,函式執行過程中呼叫自
己,而這樣的自己呼叫自己,需要有終止的條件,若
沒有終止的條件就會形成無窮遞迴。
 遞迴範例






求n階乘(
ch11\求n階乘\)
m的n次方(m^n)( ch11\求m的n次方\)
最大公因數( ch11\最大公因數\)
求最多平面區域數( ch11\求最多平面區域數\)
費氏數列( ch11\費氏數列\)
組合C(m,n)( ch11\組合\)
求n階乘(
ch11\求n階乘\)
 我們以求解n 階乘( n ! ) 之值為例, 解說遞迴的觀念。數
學上定義n 階乘為「n!=n*(n-1)*(n-2)*(n-3)*…*3*2*1」。






我們可以分階段看,求解n階乘,可以分解成n乘以(n-1)階乘,
意即「n!=n*(n-1)!」;
求解(n-1)階乘,可以分解成n-1乘以(n-2)階乘,意即「(n1)!=(n-1)*(n-2)!」;
求解(n-2)階乘,可以分解成n-2乘以(n-3)階乘,意即「(n2)!=(n-2)*(n-3)!」,
依此類推,直到求解3階乘,可以分解成3乘以2階乘,意即「
3!=3*2!」;
求解2階乘,可以分解成2乘以1階乘,意即「2!=2*1!」,
1!就不用再往下求解,直接就是1,這樣一層一層遞迴下去直到
求解1!,就終止遞迴,再一層一層往上回推,如下張投影片。
求n階乘(
ch11\求n階乘\)
求n階乘(
ch11\求n階乘\)
 寫成遞迴函式,假設函式名稱為f(n),求解n!;f(n-1)
為求解(n-1)!,代入上圖。
求n階乘(
ch11\求n階乘\)
 預覽結果
 輸入n值,點選「求n階乘」,則顯示計算過程於下方文字方塊。
求n階乘(
ch11\求n階乘\)
 表單配置
在表單中新增兩個TextBox,
兩個Label與一個Button。
 屬性設定
物件
Label1
Label2
TextBox2
TextBox2
TextBox2
Button1
屬性
Text
Text
ScrollBars
Multiline
Size
Text
設定值
輸入 n值
n!結果
Both
True
185,185
求n階乘
求n階乘(
ch11\求n階乘\)
 程式碼新增與解說
 點選「求n階乘」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
1 Public Class Form1
2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
3
f(Val(TextBox1.Text))
4
End Sub
5
Function f(ByVal n As Integer) As Integer
6
Dim result As Integer
7
If n = 1 Then
8
result = 1
9
Else
10
result = n * f(n - 1)
11
End If
12
TextBox2.Text = TextBox2.Text & "回傳" & n & "!=" & result & vbNewLine
13
Return result
14
End Function
15 End Class
求n階乘(
ch11\求n階乘\)
 解說
 第3行:使用f函式遞迴計算n階乘,n值由TextBox1輸入。
 第5到14行:遞迴函式f計算n階乘,變數n為函式f的輸入值,在f函式
中宣告變數result為整數變數(第6行)。判斷n值是否符合遞迴終止條
件,若n等於1,則終止遞迴,變數result等於1(第7到8行),否則遞迴
呼叫下去,result等於n值乘以(n-1)的階乘,求(n-1)的階乘相當於遞
迴呼叫函式f,輸入參數為n-1(第9到11行)。
 第12行:遞迴函式f回傳前,先顯示結果於TextBox2。
 第13行:經由Return指令,將執行程式控制權交回給呼叫程式,並
將變數result的值回傳。
求n階乘(
ch11\求n階乘\)
遞迴函式的結構
遞迴函式的結構
 撰寫遞迴函式前要先想好
 「遞迴函式名稱、遞迴函式的輸入變數與遞迴回傳值資料型別」
「Function f(ByVal n As Integer) As Integer」此行就是宣告遞迴函式。
 遞迴函式的名稱為「f」
 遞迴函式輸入變數「ByVal n As Integer」
 遞迴函式回傳值資料型別「As Integer」


「遞迴呼叫與遞迴呼叫輸入值」


「遞迴回傳值」


遞迴呼叫與遞迴呼叫輸入值為「n * f(n - 1)」,這就是本遞迴程式的遞迴
上下層關係。
遞迴回傳值為「Return result」
「遞迴終止條件」

遞迴終止條件為「If n = 1 Then result = 1」
m的n次方(m^n)(
ch11\求m的n次方\)
 求解m 的n 次方之值, 數學上定義m 的n 次方為n 個
m 相乘。







我們可以分階段看, 求解m 的n 次方, 可以分解成m 乘以m 的n - 1
次方, 意即「m^n=m*m^(n-1)」;
求解m的n-1次方,可以分解成m乘以m的n-2次方,意即「m^(n1)=m*m^(n-2)」;
求解m的n-2次方,可以分解成m乘以m的n-3次方,意即「m^(n2)=m*m^(n-3)」;
依此類推,直到求解m的3次方,可以分解成m乘以m的2次方,意即
「m^3=m*m^2」;
m的2次方,可以分解成m乘以m的1次方,意即「m^2=m*m^1」,
m^1就不用再往下求解,直接就是m,
這樣一層一層遞迴下去,直到求解m^1就終止遞迴,再一層一層往上
回推,如下圖。
m的n次方(m^n)(
ch11\求m的n次方\)
m的n次方(m^n)(
ch11\求m的n次方\)
 寫成遞迴函式,假設函式名稱為p(n)為求解m^n,
p(n-1)為求解m^(n-1),代入上圖。
m的n次方(m^n)(
ch11\求m的n次方\)
 預覽結果
 輸入m值、輸入n值,點選「求m的n次方」,則顯示計算過程
於下方文字方塊。
m的n次方(m^n)(
 表單配置
在表單中新增三個TextBox,
兩個Label與一個Button。
 屬性設定
物件
Label1
Label2
TextBox3
TextBox3
TextBox3
Button1
屬性
Text
Text
ScrollBars
Multiline
Size
Text
設定值
輸入 m值
輸入 n值
Both
True
235,135
求m的n次方
ch11\求m的n次方\)
m的n次方(m^n)(
ch11\求m的n次方\)
 程式碼新增與解說
 點選「求m的n次方」按鈕,新增程式碼在Button1_Click函式中
,如下方程式區塊。
行號 程式碼
1 Public Class Form1
2
Dim m As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
3 Handles Button1.Click
4
m = Val(TextBox1.Text)
5
p(Val(TextBox2.Text))
6
End Sub
7
Function p(ByVal n As Integer) As Integer
8
Dim result As Integer
9
If n = 1 Then
10
result = m
11
Else
12
result = m * p(n - 1)
13
End If
14
TextBox3.Text = TextBox3.Text & "回傳" & m & "^" & n & "=" & result & vbNewLine
15
Return result
16
End Function
17 End Class
m的n次方(m^n)(
ch11\求m的n次方\)
 解說
 第2行:宣告變數m為整數變數,變數範圍為整個Class。
 第4行:變數m的值由TextBox1輸入。
 第5行:使用p函式遞迴計算m的n次方,n值由TextBox2輸入,
並代入p函式的參數。
 第7到16行:遞迴函式p計算m的n次方,變數n為函式p的輸入值
,在p函式中宣告變數result為整數變數(第8行),判斷n值是否
符合遞迴終止條件,若n等於1,則終止遞迴,變數result等於m(
第9到10行);否則遞迴呼叫下去,result等於m值乘以m的(n-1)
次方,m的(n-1)次方相當於遞迴呼叫函式p,輸入參數為n-1(第
11到12行)。
 第14行:遞迴函式p回傳前,先顯示結果於TextBox3。
 第15行:經由Return指令,將執行程式控制權交回給呼叫程式
,並將變數result的值回傳。
m的n次方(m^n)(
ch11\求m的n次方\)
 使用圖示表示遞迴求解2的5次方,相當於m值輸入2
與n值輸入5,p(5)執行為例。
m的n次方(m^n)(

ch11\求m的n次方\)
1.遞迴函式名稱、遞迴函式的輸入值、遞迴函式回傳值資料型別
「Function p(ByVal n As Integer) As Integer」此行就是宣告遞迴
函式。
 遞迴函式的名稱為「p」
 遞迴函式輸入變數「ByVal n As Integer」
 遞迴函式回傳值資料型別「As Integer」


2. 遞迴呼叫與遞迴呼叫輸入值


3. 遞迴回傳值


遞迴呼叫與遞迴呼叫輸入值為「m * p(n - 1)」,這就是本遞迴程式
的遞迴上下層關係。
遞迴回傳值為「Return result」
4. 遞迴終止條件

遞迴終止條件為「If n = 1 Then result = m」
最大公因數(


ch11\最大公因數\)
求m與n的最大公因數,數學上可以使用輾轉相除法求解,其
原理為求m與n的最大公因數相當於求解「n除以m的餘數」與m
的最大公因數,這樣一層一層遞迴下去,直到「n除以m的餘
數」等於0,就終止遞迴,再一層一層往上回推。
以求11與25的最大公因數為例。
最大公因數(
ch11\最大公因數\)
 以數學方式表達m與n的最大公因數為
 預覽結果
輸入m值,輸入n值,點選
「求m與n的最大公因數」,
則顯示計算過程於右方文字
方塊。
最大公因數(
ch11\最大公因數\)
 表單配置
在表單中新增三個TextBox,
三個Label與一個Button。
 屬性設定
物件
屬性
設定值
Label1
Text
請輸入 m值
Label2
Text
請輸入 n值
求最大公因數過
Label3
Text
程
TextBox3 ScrollBars Both
TextBox3 Multiline
True
TextBox3 Size
160,115
求m與n的最大公
因數
Button1
Text
最大公因數(
ch11\最大公因數\)
 程式碼新增與解說
 點選「求m與n的最大公因數」按鈕,新增程式碼在
Button1_Click函式中,如下方程式區塊。
行號 程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
Dim m As Integer = Val(TextBox1.Text)
Dim n As Integer = Val(TextBox2.Text)
Dim z As Integer = gcd(m, n)
TextBox3.Text = TextBox3.Text & m & "與" & n & "的最大公因數為" & z & vbNewLine
End Sub
Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer
Dim result As Integer
If x = 0 Then
result = y
Else
result = gcd(y Mod x, x)
TextBox3.Text = TextBox3.Text & "求" & x & "與" & y & "的最大公因數" & vbNewLine
TextBox3.Text = TextBox3.Text & "相當於求" & y Mod x & "與" & x & "的最大公因數" & vbNewLine
End If
Return result
End Function
End Class
最大公因數(
ch11\最大公因數\)
 解說
 第3行:變數m的值由TextBox1輸入。
 第4行:變數n的值由TextBox2輸入。
 第5行:使用gcd函式遞迴計算m與n的最大公因數,將變數m與n代入
gcd函式。
 第6行:將所求出的m與n的最大公因數,顯示在TextBox3。
 第8到18行:遞迴函式gcd計算x與y的最大公因數,在gcd函式中宣告
變數result為整數變數(第9行)。判斷x值是否符合遞迴終止條件,若x
等於0,則終止遞迴,變數y存入result(第10到11行);否則遞迴呼叫
下去,result等於「y除以x的餘數」與x的最大公因數,「y除以x的餘
數」與x的最大公因數相當於遞迴呼叫函式gcd,輸入參數為「y Mod
x」與x(第12到13行)。
最大公因數(
ch11\最大公因數\)
 解說
 第14到15行:遞迴函式gcd回傳後,顯示輾轉相除法的原理於
TextBox3。
 第17行:經由Return指令,將執行程式控制權交回給呼叫程式,
並將變數result的值回傳。
最大公因數(

ch11\最大公因數\)
1. 遞迴函式名稱、遞迴函式的輸入值、遞迴函式回傳值資料型
別
「Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer
」此行就是宣告遞迴函式。
 遞迴函式的名稱為「gcd」
 遞迴函式輸入變數「ByVal x As Integer, ByVal y As Integer」
 遞迴函式回傳值資料型別「As Integer」


2. 遞迴呼叫與遞迴呼叫輸入值


3. 遞迴回傳值


遞迴呼叫與遞迴呼叫輸入值為「gcd(y Mod x, x)」,這就是遞迴的
上下層關係。
遞迴回傳值為「Return result」
4. 遞迴終止條件

遞迴終止條件為「If x = 0 Then result = y」
(
求最多平面區域數
ch11\求最多平面區域數\)
 n條線屬於同一平面,所切割出來的最多區域數為何?
 n等於1時,所切割出來的最多區域數為2;n等於2時,所切割出
來的最多區域數為4;n等於3時,所切割出來的最多區域數為7。
 請利用遞迴概念找出「n等於k」與「n等於k-1」的關係如下,
「n等於k」的區域數為「n等於k-1」的區域數加上k。
(
求最多平面區域數
ch11\求最多平面區域數\)
 以數學方式表達求最多平面區域數為
 預覽結果
 輸入n值,點選「求最多平面區域數」,並顯示計算過程於下方
文字方塊。
(
求最多平面區域數
ch11\求最多平面區域數\)
 表單配置
在表單中新增兩個TextBox,
兩個Label與一個Button。
 屬性設定
物件
屬性
設定值
Label1 Text
請輸入 n值
Label2 Text
區域數
TextBox2 ScrollBars Both
TextBox2 Multiline True
TextBox2 Size
165,155
求最多平面區
Button1 Text
域數
(
求最多平面區域數
ch11\求最多平面區域數\)
 程式碼新增與解說
 點選「求最多平面區域數」按鈕,新增程式碼在Button1_Click
函式中,如下方程式區塊。
行號 程式碼
1 Public Class Form1
2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
3
Dim n As Integer = Val(TextBox1.Text)
4
num(n)
5
End Sub
6
Function num(ByVal x As Integer) As Integer
7
Dim result As Integer
8
If x = 1 Then
9
result = 2
10
Else
11
result = x + num(x - 1)
12
End If
13
TextBox2.Text = TextBox2.Text & x & "條線的最多平面數為°" & result & vbNewLine
14
Return result
15
End Function
16 End Class
(
求最多平面區域數
ch11\求最多平面區域數\)
 解說
 第3行:變數n的值由TextBox1輸入。
 第4行:使用num函式遞迴計算n條線的最多平面區域數,n值由
TextBox1輸入,並代入num函式的參數。
 第6到15行:遞迴函式num計算,變數x為函式num的輸入值,在
num函式中宣告變數result為整數變數(第7行)。判斷x值是否符
合遞迴終止條件,若x等於1,則終止遞迴,變數result等於2(第8
到9行);否則遞迴呼叫下去,result等於x值加上(x-1)條線最多平
面區域數,(x-1)條線最多平面區域數相當於遞迴呼叫函式num,
輸入參數為x-1(第10到11行)。
 第13行:遞迴函式num回傳前,先顯示結果於TextBox2。
 第14行:經由Return指令,將執行程式控制權交回給呼叫程式,
並將變數result的值回傳。
(

求最多平面區域數
ch11\求最多平面區域數\)
1. 遞迴函式名稱、遞迴函式的輸入值、遞迴函式回傳值資料型
別
「Function num(ByVal x As Integer) As Integer」此行就是宣告遞
迴函式。
 遞迴函式的名稱為「num」
 遞迴函式輸入變數「ByVal x As Integer」
 遞迴函式回傳值資料型別「As Integer」


2. 遞迴呼叫與遞迴呼叫輸入值


3. 遞迴回傳值


遞迴呼叫與遞迴呼叫輸入值為「x + num(x - 1)」,這就是遞迴的上
下層關係。
遞迴回傳值為「Return result」
4. 遞迴終止條件

遞迴終止條件為「If x = 1 Then result = 2」