1.理解:
函数直接或者间接地调用自身;并且有边界条件。
1:
#include <stdio.h>
int main()
{
int result = fun(3);
printf("%d",result);
return 0 ;
}
int fun(int num)
{
if(num == 1)
return num;
return num + fun(num-1);
}
思路
2:
递归主要用于解决具有递归概念的程序或者是递归的数据结构(如 树)。堆栈结构,注意先入的后出。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5851a4c0ea7e46a80fb88892322f8f54.png)
2.基本框架
书写递归函数的流程:
1) 将问题分为小的问题
2)设置base condition来终止递归
例子:阶乘
递归的过程 + 终止条件
base condition是不需要再次调用函数的一个情况
3.递归的种类
1递归同一个函数
递归的过程大概就是:
一直调用,问题分解为更小的子问题,直到基准情形,然后开始回溯。
/**********定义Func()函数**********/
int Func(int a[], int s, int e)
{
/********** Begin **********/
int result = a[s]; // 初始化结果为子段的第一个元素
if (s == e) // 如果只有一个元素,则直接返回该元素
{
return result;
}
else if (s < e) // 如果有多个元素,则递归地查找剩余子段的最大值
{
result = max(result, Func(a, s + 1, e)); // 注意这里使用s + 1而不是++s
return result; // 返回更新后的结果
}
// 这里不需要处理s > e的情况,因为在main函数中s总是小于或等于e
/********** End **********/
}
比如查找数组a[]从a[0] 到 a[n-1]中的最大元素。递归到传入的参数s增加到e,s==e触发 base case,开始回溯——将max(a[n-1],a[n-1])返回m1,再比较(a[n-2],a[n-1],a[n-1])其实就是比较a[n-2]和m1…
关于递归的思考
思考递归,或许从base case 那个出口开始往回想,往回回溯思考会比较好理解??