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」