v77.递归

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:

在这里插入图片描述

递归主要用于解决具有递归概念的程序或者是递归的数据结构(如 树)。堆栈结构,注意先入的后出。在这里插入图片描述

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 那个出口开始往回想,往回回溯思考会比较好理解??

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值