傳值呼叫:
主程式呼叫副程式的語法-->
副程式名稱(參數1,參數2)
副程式的語法-->
static void 副程式名稱(資料型態1 參數1,資料型態2 參數2)
{
程式區塊
}
Note:這邊的參數可以是變數或陣列
EX:
Private void button1_Click(object sender,EventArges e)
{
int a=10;
int b=20;
string Temp1="呼叫前"+"a="+a+"b="+b;
label1.Text=Temp1;
CallByValue(a, b)
string Temp2="呼叫後"+"a="+a+"b="+b;
label2.Text=Temp2;
}
static void CallByValue(int x,int y)
{
x=100;
y=200;
}
實際上,因為傳值只是將值丟進不同的變數中,而不同的變數在不同的記憶體中,
所以a,b的內容不會改變。
傳址呼叫:
主程式呼叫副程式的語法-->
副程式名稱(ref參數1,ref參數2)
副程式的語法-->
static void 副程式名稱(ref資料型態1 參數1,ref資料型態2 參數2)
{
程式區塊
}
EX:
Private void button1_Click(object sender,EventArges e)
{
int a=10;
int b=20;
string Temp1="呼叫前"+"a="+a+"b="+b;
label1.Text=Temp1;
CallByValue(ref a,ref b)
string Temp2="呼叫後"+"a="+a+"b="+b;
label2.Text=Temp2;
}
static void CallByValue(ref int x,ref int y)
{
x=100;
y=200;
}
實際上,因為傳址是將變數的位址丟進函數,所以在副程式中占用同樣的記憶體,故a,b的內容會改變。
陣列傳遞呼叫:
使用時機:當一次想要傳遞非常多變數時可用。
step1: 在主程式的實際參數中,在陣列名稱前加上ref即可。如Bubsort(A,10)
step2: 在副程式中的形式參數中,在陣列名稱前加上ref,並在資料型態後面的中括號內不要設陣列大小。如static void BubSort(ref int[]A,int n)
實例:
產生1~100的亂數值10個後,再用陣列傳遞呼叫來進行資料排序。
int[]A=new int[11];
string TempStr;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string Tempstr="";
int i;
Random r=new Random();
for(i=1;i<=10;i++)
{
A[i]=r.Next(1,101);
}
BubSort(ref A,10);
for(i=1;i<=10;i++)
TempStr=TempStr+","+A[i];
textBox1.Text=TempStr;
textBox1.Text=TempStr.Stubstring(1,Tempstr.Length-1);
}
static void BubSort(ref int[]A ,int n)
{
int i,j,Temp;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if(A[i]>A[j])
{
Temp=A[i];
A[i]=A[j];
A[j]=Temp;
}
}
自訂函數:
遞迴函數:
遞迴(Recursion)是指不斷的呼叫本身的函數,並將尚未傳回的函數值暫時存放在主記憶體中(堆疊),等到最後的結果產出時,再將主記憶體中(堆疊)的值,逐一傳回。
即函數本身又可以呼叫自己的副程式。
實例:
遞迴函數呼叫10!=10X9X8X7X6X5X4X3X2X1
private void button1_Click(object sender, EventArgs e)
{
int Result,Max=10;
Result=MyFunction(Max);
label1.Text="
10X9X8X7X6X5X4X3X2X1="+Result;
}
static int MyFunction(int N)
{
if(N==0)
return 1;
else
return N*MyFunction(N-1);
}
合乎演算法的遞迴函數之條件:
1.遞迴函數要設「初值」和「終值」
2.遞迴函數必須要有更新值
3.遞迴函數必須自己呼叫自己
遞迴函數的種類:
1.直接遞迴-->如上面的實例
2.間接遞迴-->指兩個以上函數,彼此呼叫對方
遞迴函數的優缺點:
實例:用遞迴方式來撰寫Fibonacci Number(費氏數)
F
n=0 , if n=0
F
n=1 , if n=1
F
n=F
n-1+F
n-2, if n>=2
數學上-->某一數為其前兩數之和
private void button1_Click(object sender, EventArgs e)
{
int N=6,Sum;
Sum=Total(N);
label.Text="Sum="+Sum;
}
static int Total(int N)
{
if(N<=2)
return 1;
else
return Total(N-2)+Total(N-1);
}
留言