码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法入门 | 分治策略


    目录

    分治策略

    1.分治法可以解决的问题特征

    2.分治法解题步骤

    3.分治法编程举例

    递归求阶乘

    求斐波那契数列

    小练习:给出一个数n,打印其每一位


    分治策略

    1.分治法可以解决的问题特征

    (1)问题规模缩小到一定程度就可以轻易解决

    (2)问题可以分解为若干个规模较小的相同类型问题

    (3)使用小规模的解可以合并成该问题原规模的解

    (4)该问题分解出的各个子问题相互独立

    2.分治法解题步骤

    (1)分解:将原问题划分为与原问题形式相同的子问题,只是规模减小。

    (2)解决:递归求解子问题,如果子问题规模足够小则停止递归,直接求解。

    (3)合并:将小规模的解合并为原规模问题的解。

    3.分治法编程举例

    递归求阶乘

    (1)思想:不断缩小问题规模(要求n的阶乘,先求n-1的阶乘;要求n-1的阶乘,先求n-2的阶乘......)直至规模为1~求1的阶乘,再逐层返回合并解。

    递归定义式如图: 

    (2)代码实现(循环实现):

    1. int fac(int n)
    2. {
    3. if (n <= 1) return 1;
    4. int sum = 1;
    5. for (int i = 2; i <= n; ++i)
    6. {
    7. sum *= i;
    8. }
    9. return sum;
    10. }
    11. int main()
    12. {
    13. int n = 0;
    14. cin >> n;
    15. cout << fac(n) << endl;
    16. return 0;
    17. }

     时间复杂度:O(n)       空间复杂度:S(1)

    (3)代码实现(递归实现):

    1. int fac(int n)
    2. {
    3. if (n <= 1) return 1;
    4. return n * fac(n - 1);
    5. }
    6. int main()
    7. {
    8. int n = 0;
    9. cin >> n;
    10. cout << fac(n) << endl;
    11. return 0;
    12. }

    时间复杂度:O(n)       空间复杂度:S(n)

    由于递归会开辟栈帧,故有额外空间开辟:空间复杂度S(n)

    (4)补充:没有无限递归!!栈的空间是有限的,栈满会溢出。

    求斐波那契数列

    (1)思想:斐波那契数列(1 1 2 3 5 8 12 21.....),递归求解。当n>2时,fib(n)=fib(n-1)+fib(n-2);

    递归定义式如图: 

    (2)代码实现(循环实现):

    1. int fib(int n)
    2. {
    3. int a = 1, b = 1, c = 1;//c初值为1,避免写n==1||n=2时return 1
    4. //if(n==1||n==2) return 1;
    5. for (int i = 3; i <= n; ++i)
    6. {
    7. c = a + b;
    8. a = b;
    9. b = c;
    10. }
    11. return c;
    12. }
    13. int main()
    14. {
    15. int n = 0;
    16. cin >> n;
    17. cout << fib(n) << endl;
    18. return 0;
    19. }

    (3)代码实现(递归实现):

    1. int fib(int n)
    2. {
    3. if (n == 1 || n == 2) return 1;
    4. return fib(n - 1) + fib(n - 2);
    5. }
    6. int main()
    7. {
    8. int n = 0;
    9. cin >> n;
    10. cout << fib(n) << endl;
    11. return 0;
    12. }

    时间复杂度:O(n)       空间复杂度:S(n)

    小练习:给出一个数n,打印其每一位

    (1)代码实现(循环实现):

    1. void PrintInt(int n)
    2. {
    3. if (n < 0) return;
    4. while (n != 0)
    5. {
    6. printf("%d ", n % 10);
    7. n /= 10;
    8. }
    9. }
    10. int main()
    11. {
    12. int n = 0;
    13. cin >> n;
    14. PrintInt(n);
    15. return 0;
    16. }

    (2)代码实现(递归实现):

    1. void PrintInt(int n)
    2. {
    3. if (n <= 0) return;
    4. printf("%d ", n % 10);
    5. PrintInt(n / 10);
    6. }
    7. int main()
    8. {
    9. int n = 0;
    10. cin >> n;
    11. PrintInt(n);
    12. return 0;
    13. }
  • 相关阅读:
    Sora来袭!机器人+Sora落地性如何?
    怎么把flac音频变为mp3?
    Ai版式设计类型 优漫动游
    软件测试工程师的职业规划
    园子的商业化努力:欢迎关注DataFun联合行行AI举办的数据智能创新与实践人工智能大会
    【学习笔记39】获取DOM标签对象
    前端培训丁鹿学堂:ts入门完结篇
    Zabbix技术分享——如何快速部署zabbix-agent客户端
    游戏网页设计成品 学校班级网页制作模板 大学生静态HTML网页源码 dreamweaver网页作业 简单网页课程成品
    Python给exe添加以管理员运行的属性
  • 原文地址:https://blog.csdn.net/m0_56194716/article/details/127737842
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号