首页 > 其他分享 >学C笔记归纳 第十三篇——函数3 递归(重点)

学C笔记归纳 第十三篇——函数3 递归(重点)

时间:2023-12-13 17:12:11浏览次数:26  
标签:count return 递归 int 笔记 fib printf 十三篇

1.什么叫递归?

        递归是一种编程技巧,程序调用自身的编程技巧称为 “递归”,应用广泛。

2.描述递归

        递归把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,

        只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少了程序代码量。

3.递归的核心思想

        把大事化小。 

来看一个例子:输入一个无符号整型值,按照顺序打印它的每一位 

 

#include <stdio.h>

void print(unsigned int x)
{
    int num = x % 10;
    if (num)
    {
        print(x/ 10); //递
        printf("%d ", num); //归
    }
    
}
int main()
{
    unsigned int n = 0;
    scanf("%u", &n);
    print(n); //接受一个无符号整型值,按照顺序打印它的每一位
    return 0;
}
 

 

4.该例子的抽象理解

        递归递归,先递递递...再归归归...;

        递:1p中断将处理过的参数传给下一个 2p处理传3p......直到触发限制条件开始归;

        归:归:递完,执行递语句之后的语句,从后向前......完了在执行3p的归、2p、1p

        递有多少,归就有多少。

5.Stack overflow(栈溢出)

        递如果没有终止条件,就会不停的调用自身,每一次函数调用都会在栈区申请空间,最终导致栈溢出。

6.递归的两个必要条件

        ·存在限制条件,当满足这个限制条件的时候,递归便不在继续;

        ·每次递归调用之后越来越接近这个限制条件。

 

练习:模拟strlen功能写个函数,不能创建临时变量。

 

#include <stdio.h>

//模拟strlen功能写个函数,不能创建临时变量。
//int my_strlen(char str[]) //参数写成数组形式也行
int my_strlen(char* str) //参数写成指针形式
{
    if(*str != '\0') //限制条件, 注意是单引号,双引号判定会出错,陷入递归导致栈溢出
        return 1 + my_strlen(str+1); //最好不要写str++,它会改变str本身
    else
        return 0;
}
int main()
{
    char arr[] = "abc"; //{"1","2","3","\0"}
    int len = my_strlen(arr);
    printf("%d\n", len);
    return 0;
}
 

 

并不是所有问题都适合递归求解,例如 打印第n 个斐波那契数列 数:

 

//  打印第n 个斐波那契数列 数:1 1 2 3 5 8 13 

int count = 0;
int fib(int x)
{
  if (x == 3)
  count++;
  if (x > 2)
    return fib(x - 1) + fib(x - 2);
  else
  {
    return 1;
  }
}
int main()
{
  int n = fib(5);
  printf("%d\n",n);
  printf("count =%d\n", count);
  return 0;
}

 



但如果打印第30个,记录x=3计算次数呢

#include <stdio.h>


// 打印第n 个斐波那契数列 数:1 1 2 3 5 8 13
int count = 0;
int fib(int x)
{
  if (x == 3)
    count++;
  if (x > 2)
    return fib(x - 1) + fib(x - 2);
  else
  {
    return 1;
  }
}
int main()
{
  int n = fib(30);
  printf("%d\n",n);
  printf("count =%d\n", count);
  return 0;
}

 

317811次!这个计算量就恐怖了,函数递归会不断占用栈区空间,如果是第60、100呢?显然有几率发生栈溢出现象。故此时递归求解不可取。

 

 

int main()
{
    int n = 30;
    int a = 1;
    int b = 1;
    int c = 1;
    while (n>=3)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    printf("%d\n", c);
    //printf("count =%d\n",count);
    return 0;
}

 

 

 

因此,在解决问题时,我们的权衡利弊十分重要,如果写个函数,用递归轻松解决问题且不会占用太多内存空间,就用递归方式,反之非递归。 

标签:count,return,递归,int,笔记,fib,printf,十三篇
From: https://www.cnblogs.com/xiaowanglong/p/17898863.html

相关文章

  • 软件架构读书笔记2
    第二部分:计算机功底主要讲解的是术。计算机功底、语言、框架、网络、数据库、操作系统等。印象最深刻的是框架那一章。作者提到,熟悉一个框架之后,更多的是应该去关注它的缺点,而不是优点。更应该关注它不能做什么,而不是它能做什么。它不能做什么往往是别的框架的改进点。细想,如......
  • 软件架构设计读书笔记
    第一部分:什么是架构?一句话:架构是针对所有重要问题做出的重要决策。不同公司或者相同公司在不同的阶段所面临的问题不同,架构自然也会有所不同。个人认为,不存在称之为完美的架构,只会存在最适合的。面对的场景,着重的目的不同,那么相应的决策也会不同(有点废话)。架构的分类。作......
  • Linux系统中curl命令使用笔记
    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,用来请求Web服务器,它的名字就是客户端(client)的URL工具的意思,可以说是一款很强大的http命令行工具,它支持文件的上传和下载,是综合传输工具。可以看出它的参数非常多,a-z的字母,几乎都用到了,参数这么说,功能肯定很强大......
  • atlas 2001 dk A2 研发笔记
    atlas2001dkA2开发者套件: www.hiascend.com/hardware/devloper-kit-a2 课程:https://www.hiascend.com/zh/developer/courses/detail/1638576084570705922 os:https://www.hiascend.com/hardware/developer-kit-a2/resource xterm: https://mydown.yesky.com/pcsoft/988......
  • KMP 学习笔记
    符号规定先来规定一些符号。\(\lvertS\rvert\)代表这个字符串\(S\)的长度。\(S_{l\cdotsr}\)代表字符串从第\(l\)个字符到第\(r\)个字符组成的字串。\(F(S,i)\)等同于\(S_{1\cdotsi}\)(就是字符串长度为\(i\)的前缀)\(E(S,i)\)等同于\(S_{\lvertS\rvert-i+1......
  • 阅读笔记:《代码大全》阅读笔记十
    《代码大全》是我在软件开发领域的一本必读书籍。这本书几乎涵盖了软件开发的方方面面,从编码到设计、测试到调试等各个环节都有详细的讲解和指导。首先,我被作者对于代码的重视所深深吸引。他在书中强调,代码质量决定了软件的可靠性和可维护性。好的代码应该易读、易懂、易维护。通......
  • STM32学习笔记_外部中断EXTI
    中断:在主程序中运行过程中,出现了特定的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。中断嵌套:当一个中断程序正在......
  • sql学习笔记
    数据库原理1.数据库概念数据库定义数据库的特点2.数据库管理系统(DBMS)DBMS的功能常见的DBMS软件3.数据模型关系模型的基本概念数据库范式的概念和应用4.数据库事务和并发控制事务的ACID特性并发控制的方法和技术SQL语言基础1.SQL概述SQL语言的起源和......
  • 《软件需求模式》阅读笔记二
    《软件需求模式》第3、4章阅读笔记其中第3章描述了需求模式扮演的角色,解释了每个模式的一些具体内容和具体结构。而第4章则介绍了何时以及如何去使用需求模式,如何从原有的模式创造出新的模式或者直接编写新的模式。第3章首先为我们解释了需求模式的概念:定义一种特定类型需求的方......
  • 前端学习笔记DAY2 HTML5基础(2)(b站pink老师)
    二.HTML标签4.HTML常用标签4.1标签语义学习标签的重点是记住每个标签的语义。就是指标签的含义,即这个标签是用来干嘛的。根据标签的语义,在合适的地方给一个最为合理的标签,可以让页面结构更清晰。※4.2标题标签<h1>-<h6>HTML提供了6个等级的网页标题,即<h1>-<h6>。......