/*
* 大递归思路:
* 1)调度器必须完整地处理最简单的情况,而无需再调用迭代函数;
* 2)当调度器调用迭代函数时,必须向它传递问题的更简单版本。
*
*
* 递归的对比:
* 1) 概念复杂性
* 2) 性能: 函数调用会带来显著的开销;
* 3) 控件需求: 递归将形成一个长长的函数调用链,依次等待其他调用的完成;
* 每个还没有结束的函数调用都会占用系统堆栈的空间;
*
* !!在递归和迭代做出决定的最基本规则是:在上面这些反对意见不成立时才选择递归
*
* 注意:1) 避免过多的参数(使用头递归,尽量避免尾递归)
* 2) 避免全局变量
*
*
*/
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int[] integer = { 100, 101, 102, 103, 104 }; 6 int[] number = { 1,2,3,0,8,9,0}; 7 8 Console.WriteLine("this is the sum by interation: sum=" + arraySumInteration(integer, 5)); 9 Console.WriteLine("this is the sum by recursion: sum=" + arraySumRecursive(integer, 5)); 10 11 Console.WriteLine("this is the zeroCount by recursion count=" + zeroCountRecursion(number, 7)); 12 Console.ReadKey(); 13 14 } 15 16 17 //迭代函数 18 static int arraySumInteration(int[] integers, int size) 19 { 20 int sum = 0; 21 for (int i = 0; i < size; i++) 22 { 23 sum += integers[i]; 24 } 25 return sum; 26 } 27 28 29 //用递归代替迭代 (头递归) 尽量避免尾递归 30 //根据迭代函数期望接收的参数列表来编写递归函数的参数列表 31 static int arraySumRecursive(int[] integers, int size) 32 { 33 if (size == 0) return 0; 34 int lastNumber = integers[size - 1]; 35 int allButLastSum = arraySumRecursive(integers, size - 1); 36 return lastNumber + allButLastSum; 37 } 38 39 40 //值为0的个数 41 static int zeroCountRecursion(int[] numbers, int size) 42 { 43 if (size == 0) return 0; 44 int count = zeroCountRecursion(numbers, size - 1); 45 if (numbers[size - 1] == 0) count++; 46 return count; 47 } 48 49 }