C语言中的递归

简介: C语言中的递归

前言

提示:这里可以添加本文要记录的大概内容:

递归是一种解决问题的奇妙方法,可以让计算机以很少的代码而完成大量的计算,下面来简单的看一下递归吧:


提示:以下是本篇文章正文内容,下面案例可供参考

一、递归是什么?(函数自己调用自己)

递归:递指的是递推,归指的是回归,递推实际上是两个过程,一是先依次递归,然后依次回归,在C语言中,递推所呈现出来的是同一个函数的重复调用,且具有限制条件并逐步逼向限制条件的一种形式

递归的使用前提:

1.有限制条件,可以进行逐步分解

2.每次进行递归后都可以逼向这个限制条件

注意:不是所有的代码都能使用递归,递归是一种特殊方法,即使有一些代码满足限制条件,也会因为效率,代码读写的问题而不适用于递归的方法。

二、递归场景的导入:

比如,我们想要计算10^5

这个结果,我们可以将其拆分为10✖10^4

继续拆分为10✖10✖10^3

最终拆分为10✖10✖…✖10的这种形式

之后计算机为了求10^5

可以分解为10✖10^4,

那么计算机为了求10✖10^4,

必须先求10^4。。。

依次类推,

为了便于大家理解,我们直接上图来演示一波

为了更深入的理解一下递归,我们不妨通过几个例子来探求:

三、递归的练习题:

eg1.计算n个斐波那契数字(递归):

#define _CRT_SECURE_NO_WARNINGS 1
//计算n个斐波那契数字(递归):
#include<stdio.h>
int Fib(int n)
{
  if (n == 1 || n == 2)
    return 1;
  else
    return Fib(n - 1) + Fib(n - 2);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = Fib(n);
  printf("%d ", ret);
  return 0;
}

eg2.使用递归实现某个数字的n次方

代码如下(示例):

//使用递归实现某个数字的n次方
#include<stdio.h>
int power(int n, int k)
{
  if (k == 1)
    return n;
  else
    return (n * power(n,k-1));
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int k = 0;
  scanf("%d", &k);
  int ret = power(n,k);
  printf("%d的%d次方是%d ",n,k, ret);
  return 0;
}

eg3.计算一个数的每位之和(递归实现)

//计算一个数的每位之和(递归实现)
int c = 0;
sum(int num)
{
  c += num % 10;
  if (num < 10)
    return c;
  else
    return(sum(num / 10));
}
#include<stdio.h>
int main()
{
  int num = 0;
  scanf("%d", &num);
  int ret = sum(num);
  printf("%d ", ret);
  return 0;
}

eg4.递归的方法实现求阶乘

//方法一:递归的方法实现求阶乘
#include<stdio.h>
jp(int num)
{
  if (num == 1)
    return 1;
  else
    return num* jp(num - 1);
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  printf("%d ",jp(num));
  return 0;
}

eg5:依次正打印某一个数字的每一位

#include<stdio.h>
int test(int num)
{
  if (num > 9)
  {
    test(num / 10);
  }
  printf("%d ", num % 10);
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  test(num);
  return 0;
}

四、但是有些地方,也可以不用递归的方法实现:

比如:

eg1修改:计算n个斐波那契数字(非递归):

//使用一般的逻辑方法来求第n个斐波那契数字:
#include<stdio.h>
int Fib(int n)
{
  int a = 1;
  int b = 1;
  int c = 2;
  if (n == 1 || n == 2)
    return 1;
  else
  {
    if (n > 3)
    {
      while (n - 2)
      {
        c = a + b;
        a = b;
        b = c;
        n--;
      }
    }
    return c;
  }
}
int main()
{
  int n = 1;
  scanf("%d", &n);
  int ret = Fib(n);
  printf("%d", ret);
  return 0;
}

eg2:使用非递归的方法实现阶乘:

//方法二:使用非递归的方法实现阶乘:
#include<stdio.h>
int main()
{
  int num = 0;
  scanf("%d", &num);
  int i = 0;
  int sum = 1;
  for (i = 1; i <= num; i++)
  {
    sum *= i;
  }
  printf("%d ", sum);
  return 0;
}
#include<stdio.h>
test(int num)
{
  if (num < 9)
    printf("%d ", num % 10);
  else
    while (num / 10)
    {
      num /= 10;
      test(num / 10);
    }
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  test(num);
  return 0;
}

并且,我们需要注意,使用非递归的方式往往要比使用递归的方式效率更高,比如eg1中求斐波那契数列时候。。。

五、总结

本文首先简单介绍了什么是递归说明了递归的前提条件,之后重点举例来说明递归的使用方法,这里需要注意递归虽好,但不可什么都用递归,要注意代码可读性,效率等多种性能的考量来综合选择非递归与递归的方式~

好了,今天的递归函数就介绍到这里吧~

欢迎各位点赞—评论—收藏

如果存在不足之处请评论留言,共同进步!

相关文章
|
3月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
42 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
27天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
54 7
|
1月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
33 2
|
1月前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
38 0
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
79 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
4月前
|
存储 编译器 C语言
|
3月前
|
算法 编译器 C语言
【C语言】递归
【C语言】递归
20 0
|
5月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
110 7
|
5月前
|
C语言
C语言--函数递归与迭代
C语言--函数递归与迭代
TU^
|
5月前
|
机器学习/深度学习 C语言
C语言之函数递归
C语言之函数递归
TU^
43 1