C语言 function recursion函数递归详解

 更新时间:2021年10月22日 10:18:01   作者:Dark And Grey  
递归指的是在函数的定义中使用函数自身的方法,举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,循环下去

function recursion(函数递归)

函数递归: 是在 一个 过程 或 函数 在其定义或说明中有 直接 或 间接 调用自身 的一种方法

通常把一个 大型复杂的问题 层层 传化 为一个与 原理相似的 ,规模较小 的问题

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

递归的中心思想为:

大事化小。

程序一

#include<stdio.h>
int main()
{
    printf("hehe");
    main();//陷入死循环,但因为栈溢出,最后会停下来 == stack overflow - 栈溢出

 任何一次函数调用,它都会向内存申请空间,分为三部分 栈区,堆区,静态区

 栈区 :局部变量,函数的形参

堆区: 动态开辟的内存 - malloc(分配内存) and calloc(动态内存分配并初始化零)

 静态区: 全局变量,static修饰的变量
    return 0;
}

递归的两个必要条件

1,存在限制条件,当满足这个限制条件的时候,递归将不再继续
2.每次递归调用之后越来越接近这个条件

程序一:

#include<stdio.h>
一共调用三次 
1                                                    2                                    3
void print(int n)// n == 123                       void print(int n)n == 12         void print(int n)  m == 1 
{                                           //    {                                 {                                             
    if (n > 9)                             //         if (n > 9)                        if (n > 9)         
    {                                       //        {                                {                                       
        print(n / 10);// 这里再调用 print 函数            print(n / 10);                  print(n / 10);            
    }                                      //         }                                }
    printf("%d ",n%10);   // 最后打印3  //           printf("%d ",n%10); 再打印个2      printf("%d ",n%10); 首先打印 1
}                                          //     }                                 }   
int main()
{
    unsigned int num = 0;
    scanf("%d",&num);//123
    //递归
    print(num);//1 2 3 
    return 0;
}

程序二:

#include<stdio.h>
#include<string.h>

写法1(计数器)
int my_strlen(char* str)//str指针变量,需要返回整形
{
    int count = 0;   
    while (*str != '\0')
    {
        count++;
        str ++;
    }
    return count;
}
写法2(递归)
int my_strlen(char* str)//str指针变量,需要返回整形
{
    if (*str != '\0')
    {
        return 1 + my_strlen(str + 1);
    }
    else
        return 0;
}
int main()
{
    char arr[] = "bit";
    //int len = strlen(arr);
    //printf("%d\n", len);

    //模拟实现一个strlen函数
    int len = my_strlen(arr);
    printf("len = %d\n",len);
    return 0;
}

练习

求n的阶乘

迭代与递归

#include<stdio.h>
1 迭代方式
 int facl(int n)
{
    int i = 0;
    int ret = 1;
    for (i = 1; i <= n; i++)
    {
        ret = ret*i;
    }
    return ret;
}

递归方式
int facl(int n)
{
    if (n <= 1)
    {
        return 1;
    }
    else
        return n*facl(n - 1);
        这里说明一下思维
        假设 我们 要求 10 的阶乘 1x1x2x3x4x5x6x7x8x9x10
        我们的 n 一开始是 10, 10*facl(n-1) ,其实 facl 函数 就是 把 10 减一,递归就好像是循环,循环的目的,就是 得到 10每次减一的结果,直到它等于1,再让其链接起来,
        你可以这么看
        10 *(9 * (8 * (7 * ((6 * (5 * (4 *(3 * (2 * (1 * (1))))))))))
        等价于
        10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 * 1
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = facl(n);//循环方式
    printf("%d\n",ret);
    return 0;
}


再来道例题

斐波那契函数 1 1 2 3 5 8 13 21
从 第三个数 开始,该数等前面两个数的和。
求第第n个斐波那契函数

#include<stdio.h>
这题用递归效率很低,很多数会重复计算
int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1)+fib(n - 2);// 因为 函数 每得到一个数,就需要将得到的数进行分解成 2个 部分
}

2迭代(循环)方式(简单加法)
效率更高
int fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while (n>2)// 
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = fib(n);
    printf("%d\n",ret);
    return 0;
}

在这里插入图片描述

到此这篇关于C语言 function recursion函数递归详解的文章就介绍到这了,更多相关C语言 函数递归内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++11新特性之自定义字面量

    C++11新特性之自定义字面量

    这篇文章主要介绍了C++11新特性之自定义字面量的相关资料,帮助大家更好的学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++详解链栈的实现

    C++详解链栈的实现

    今天我们学习的是链栈,也就是说栈的链式结构,我们运用顺序链的方式来实现。首先呢,链栈是不存在存储空间满的情况的,所以可以说它是个无底洞,然而我们之前学的顺序栈是有额定空间的
    2022-06-06
  • 全排列算法的原理和实现代码

    全排列算法的原理和实现代码

    这篇文章主要介绍了全排列算法的原理和实现代码,全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个,需要的朋友可以参考下
    2014-08-08
  • win32下进程间通信(共享内存)实例分析

    win32下进程间通信(共享内存)实例分析

    这篇文章主要介绍了win32下进程间通信(共享内存)实例分析,对win32应用程序及进程的原理做了较为深入的剖析,需要的朋友可以参考下
    2014-07-07
  • C++ 中指针和引用有什么区别详解

    C++ 中指针和引用有什么区别详解

    这篇文章主要介绍了C++ 中指针和引用有什么区别详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • 求数组中最长递增子序列的解决方法

    求数组中最长递增子序列的解决方法

    本篇文章是对c++中求数组中最长递增子序列的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言用栈模拟实现队列问题详解

    C语言用栈模拟实现队列问题详解

    本片文章带你分析如何用两个栈,并且只使用栈的基本功能来模拟实现队列,其中同样只实现队列的基本功能,感兴趣的朋友来看看吧
    2022-04-04
  • C语言嵌入式实现支持浮点输出的printf示例详解

    C语言嵌入式实现支持浮点输出的printf示例详解

    这篇文章主要为大家介绍了C语言嵌入式实现支持浮点输出的printf示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈C语言函数调用参数压栈的相关问题

    浅谈C语言函数调用参数压栈的相关问题

    下面小编就为大家带来一篇浅谈C语言函数调用参数压栈的相关问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C语言中的long型究竟占4个字节还是8个字节(遇到的坑)

    C语言中的long型究竟占4个字节还是8个字节(遇到的坑)

    小编在复习C语言的时候踩到了不少坑,纠结long类型究竟占4个字节还是8个字节呢?好,今天通过本文给大家分享下我的详细思路,感兴趣的朋友跟随小编一起看看吧
    2021-11-11

最新评论