直接看源代碼;
總結:
第一種方式,利用中間變量進行累加,這種方式最簡單粗暴;
第二種方式; 利用我們linq aggretion(聚合)的原理,有點函數編程的感覺,每一次求和的結果,參與到下一次的計算中;
第三種方式:經典的遞歸;
三種方式,結果沒有什么,差異,更過的是體會實現過程;
/// <summary> /// 這種是利用中間變量實現累加的一個過程; /// </summary> static void Sum() { int sum = 0; int n = 3; for(int i = 1; i <=n; i++) { sum+=i; } Console.WriteLine($"{sum}"); } /// <summary> /// 這種有點函數式編程的想法;一次相加的結果,返回參與到另一次求和中 /// 這個就是我們linq的aggrega 的原理; /// </summary> /// <param name="acctor"></param> /// <param name="num"></param> /// <returns></returns> static int acc(int acctor,int num) { return acctor + num; } /// <summary> /// /// </summary> static void TestAcc() { int total = 0; int num = 3; for (int i = 1; i <=num; i++) { total = acc(total, i); } Console.WriteLine(total); } //用遞歸的方式來求和; static int Recurrion(int num) { if (num == 0) { return 0; } return num+ Recurrion(num - 1); } static void Main(string[] args) { Console.WriteLine("sum-----"); Sum(); Console.WriteLine("acc-----"); TestAcc(); Console.WriteLine("recursion----"); int result = Recurrion(3); Console.WriteLine(result); Console.ReadLine(); }
結果:
這里再對第二種方式,進行一定的優化=》有點尾遞歸的效果了,大概的思想,就是想函數計算的后的結果,當成參數;傳遞進入函數,參與到下一次的計算中
/// <summary> /// 一次函數計算的結果,又參與到另一次(下一次的函數計算中) /// 本次計算的結果,參數到下次一的計算中; /// </summary> /// <param name="n"></param> /// <param name="acc"></param> /// <returns></returns> static int acc(int n,int ac) { if (n == 0) { return ac; //直接就返回計算的結果了 } else { int thisTimeCalResult = n + ac;//本次計算的結果, return acc(n-1,thisTimeCalResult); //參與到下一次的結算中 } } /// <summary> /// 還有順便提一下,系統自帶的聚合函數 /// 原理和上面的基本一致 /// </summary> /// <param name="list"></param> /// <returns></returns> static int agg(List<int> list) { int result =list.Aggregate(4,(x,y)=>x+y); //我們也可用通過求乘法的方式來進行各種計算滴呀; return result; } /// <summary> /// /// </summary> /// <param name="args"></param> static void Main(string[] args) { int val = 8; List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 }; int sum_acc = acc(val,0); int sum_agg = agg(list); Console.WriteLine(sum_acc); Console.WriteLine("這個就是通過我們聚合的方式,來實現我們這種數據的計算滴呀"); Console.WriteLine(sum_agg); Console.ReadLine(); }