|
函数自己调用自己叫做递归,递归是解决问题的通用方法之一。
生活里面也有很多的递归的例子,比如说要求10个数字里面的最大数,我们可以先求出前九个数的最大数,然后把它和第10个数进行比较判断谁更大。而求前面9个数的最大数又可以先求出前面8个数的最大数,然后和第9个进行比较,***,求前两个数的最大数就是前1个数的最大数和第2个数进行比较,最后(!)求前一个数的最大数,那就是自己。这样一个思维就是递归的思维。
与之对应的是递推的思维:第一个数假设就是最大的,然后它和第二个数进行比较,留下一个最大的,然后它又和第3个数进行比较,留下最大的,***,直到第10个数比较完成。
看得到:相同的的方式他们都有一个终点,但递归的终点是n=1,递推的终点是n=10。
最明显的区别是 递归是由大到小处理问题,递推是由小到大。
看看两个程序的写法,对比感觉下它们的异同。
- int a[]= {0,1,3,7,4,8,9,0,5,6,2}; ///第一个0不用
- int getmax1(int n) ///求前n个数的最大数递归做法
- {
- if(n==1) return a[1]; ///一个数的最大数当然是自己
- else
- {
- int t=getmax1(n-1); ///求出前面n-1个的最大
- if (a[n]>t) t=a[n]; /// 和这个数比较再求最大
- return t;
- }
- }
- int getmax2(int n) ///求前n个数的最大数递推做法
- {
- int t=a[1];
- for (int i=2; i<=n; i++)
- if (a[i]>t) t=a[i];
- return t;
- }
复制代码
在代码上看得到,递归做法n值是由大到小,没有使用循环,而是自己调用自己。递推做法i值由小到大,用的是for循环。
|
|