폴킴 (Paul Kim) -你都記得 You Remember

曾經有那樣深刻的感情,因為家裡反對和當時自己的懦弱 在那之後幾乎看到廟宇就許下:願把自己下半輩子的幸福都給你,只願你幸福喜樂 所以看到這段歌詞非常有感,年紀即將過40,所以真的得若無其事地活下去  네가 아주 행복했음 좋겠어 要是你過得幸福就好了 대신 내가 불행하면 좋겠어 要是換成我變得不幸就好了 기억나지 않았으면 좋겠어 如果什麼都不記得就好了 다시 돌아갈 수 있음 좋겠어 如果能夠再次回頭就好了 너의 찰나와 영원들이 願你所有的剎那和永恆 너만의 것이 되길 都變成專屬於你自己的時刻 사실 난 행복을 잘 몰라 但其實我真的不懂所謂的幸福是什麼 너는 아무렇지 않게 살아가야 하니까 因為你得若無其事地活下去

副程式運用


傳值呼叫:

主程式呼叫副程式的語法-->
副程式名稱(參數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(費氏數)

Fn=0      , if n=0
Fn=1      , if n=1
Fn=Fn-1+Fn-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);

}

































































































留言

這個網誌中的熱門文章

C# 裡 List用法

"需要有物件參考才能使用非靜態欄位、方法或屬性"的問題排除

達因筆 & 表面能 原理