于递归的理解及递归表达式复杂度分析(以求解最大公约数为例)

简介:

一,递归的四大基本法则:

①基准情形

基准情形是指那些不需要递归(不需要经过函数调用)之后就能退出的情况。它保证了递归的结束。

②不断推进

每一次递归之后,都要向着基准情形靠近,并且在靠近的过程中问题的规模越来越小。

③设计法则

书上说是:假设所有的递归调用都能运行-----“不是特别理解”

④合成效益法则

不要在不同的递归调用中做重复的工作。

 

二,实例

求解最大公约数--采用欧几里德算法

复制代码
 1 public static int gcd_recursive(int m, int n){
 2         if(m < n)
 3         {
 4             int tmp = m;
 5             m = n;
 6             n = tmp;
 7         }
 8         
 9         if(n == 0)
10             return m;//基准条件
11         return gcd_recursive(n, m%n);//不断推进
12     }
复制代码

分析:

第9-10行,是递归的基准条件。如果n=0,函数执行到10返回,不会执行到11行进行递归调用。

第11行,进行递归调用的地方。它是不断推进的,因为递归调用的参数朝着基准条件的方向变小了,如:

gcd_recursive(16,12)---->gcd_recursive(12,4)--->gcd_recursive(4,0)

每次递归调用,问题的规模越来越小了。

 

时间复杂度分析:

由公式: m%n<=m/2  可知:每次递归调用,问题的规模减小一半,类似于二分查找,这显然是一个非常好的算法。

由于第2-5行,花费的时间为常量时间,同样,在第9-10行的if语句判断也是花费的常量时间,在第11行进行递归调用,问题规模减少一半。

可得出,T(N) = T(N/2)+O(1)  推出:时间复杂度为O(logN)

-------------------------------------------------------------

递归逻辑的分析:

对于 gcd_recursive(16,12),第9行不成立,进入到第11行递归

对于 gcd_recursive(12,4), 第9行不成立,进入到第11行递归

对于gcd_recursive(4,0),直接执行到第9行返回,返回的值是4

返回之后,程序此时执行到gcd_recursive(12,4)中的第11行(即最后一行,不要被第9行干扰!第9行在gcd_recursive(12,4)中根本没有执行!!)

第11行代码是:gcd_recursive(4,0)

因为,gcd_recursive(4,0) 的结果是4,故 return gcd_recursive(4,0) 返回的结果也是 4。也即gcd_recursive(12,4)执行完成之后返回4。

 

由上面gcd_recursive(12,4)执行完成之后返回4,那么当gcd_recursive(16,12)的第11行代码 return gcd_recursive(12,4) 

执行完毕时,

整个程序结束了,返回的结果最终是4。

 

这种形式的递归又称为尾递归。可以看出,尾递归形式的程序最终返回的值就是 最里层递归调用得到的值。

 

在这篇文章中:字符数组转换成数字

递归的时间复杂度分析如下:

return recurse(c, len - 1) * 10 + (c[len - 1] - '0');

使得每次递归时,问题规模减小1,而后面的 + (c[len - 1] - '0') 操作可视为常量时间,故复杂度:

T(N) = T(N-1)+O(1)  得到T(N)=O(N)

 

结论:

对于递归操作而言,如果每次递归使问题的规模减半,而其他操作都是常数时间

T(N)=T(N/2)+O(1), 则T(N)=O(logN)

若每次递归使用问题的规模减1,而其他操作是常数时间

T(N)=T(N-1)+O(1),则T(N)=O(N)

 

若每次递归使问题的规模减半,而其他操作是线性时间,T(N) = T(N/2)+O(N)

则T(N)=O(NlogN)


本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5369881.html,如需转载请自行联系原作者

相关文章
|
23天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
33606 133
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
5天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
2690 10
|
18天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7228 21
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
17天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5104 12
|
20天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5882 23
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手

热门文章

最新文章