C语言之函数递归

简介: C语言之函数递归

1. 概念


C语言中,函数直接或间接调用函数本身,则该函数称为递归函数。


递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。


递归的主要思考方式在于:把大事化小


2. 递归的两个必要条件


//例子:
void func()
{
  //...
  if(...)
    func();//调用自身
  else
  //...
}

在上面的例子中能够看出,它必须满足以下两个条件:


🍥 在每一次调用自己时,必须是(在某种意义上)更接近于解;

🍥 必须有一个终止处理或计算的限制条件,当满足这个限制条件的时候,递归便不再继续。


🍤实例1:


接收一个整型值(无符号),按照顺序打印他的每一位。

例如:

  输入123,输出1 2 3


非递归:


#include<stdio.h>
int main()
{
  int n=123;
  int a = n / 100;//取百位
  int b = (n / 10)%10;//取十位
  int c = n % 10;//取个位
  //依次输出
  printf("%d %d %d\n", a, b, c);
  return 0;
}

递归:


#include<stdio.h>
void Fun_c(int x)
{
  if (x >9)//限制条件
  {
  Fun_c(x/10);
  }
  printf("%d ", x%10);
}
int main()
{
  int n;
  scanf("%d", &n);
  Fun_c(n);
  return 0;
}

图解:

bcaadeb3b5b12f6d2d4563bf1d5b291f_4e9b1ede04f1448a88fb7b608bd3b177.png


🍤实例2:


编写函数不允许创建临时变量,求字符串的长度。


int Length(char* s)
{
  if (*s == '\0')//限制条件
    return 0;
  else
    return 1 + Length(s + 1);
}
#include<stdio.h>
int main()
{
  char* ch = "iloveC";//字符串结束标志:'\0'
  int len = Length(ch);
  printf("%d", len);
  return 0;
}

第一次 s=“iloveC\0”------5+1

第二次 s=“loveC\0”-----4+1

第三次 s=“oveC\0”----3+1

第四次 s=“veC\0”----2+1 ( 回退)

第五次 s=“eC\0”----1+1

第六次 s=“C\0”----1+0

第七次 s=“\0”-----0


340531fb5b7f9d7e660cd8111b2b1235_5f63b45e54674da2bb8ee40d4a4beccf.png


3. 递归与迭代


3.1 求n的阶乘


b339ac4c06fd602947df14800b9da866_73d7929724764fbab99c67fc81c0f897.png

//递归
#include<stdio.h>
int Fac(int n)
{
  if (n == 1)//限制条件
    return 1;
  else
    return n * Fac(n - 1);
}
int main()
{
  int n;
  scanf("%d", &n);
  int temp = Fac(n);
  printf("%d\n", temp);
  return 0;
}
//迭代
int Fac(int n)
{
  int temp = 1;
  for (int i = 1; i <= n; i++)
  {
    temp = temp * i;
  }
  return temp;
}
#include<stdio.h>
int main()
{
  int n;
  scanf("%d", &n);
  printf("%d\n", Fac(n));
  return 0;
}

3.2 求第n个斐波那契数

1 1 2 3 5 8 13 21…

从第三位开始,后一项等于前两项之和


91dded8cc2410561279dacd511d98cab_0c1f86e13fa4401bad9df6cd57de3cef.png


//递归
#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;
  scanf("%d", &n);
  printf("%d\n", Fib(n));
  return 0;
}
//迭代
#include<stdio.h>
int Fib(int n)
{
  int a = 1;
  int b = 1;
  int c;
  while (n >= 3)
  {
    c = a + b;
    a = b;
    b = c;
    n--;
  }
  return c;
}
int main()
{
  int n;
  scanf("%d", &n);
  printf("%d\n", Fib(n));
  return 0;
}

注:

🍥 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

🍥 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

🍥 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。


结束语


递归是函数实现的一个很重要的环节,我们不但要理解,还要掌握,能够熟练使用递归,希望这篇文章能够帮助到你。


相关文章
|
5天前
|
存储 C语言
向函数传递结构体: C语言中的结构体参数传递详解
向函数传递结构体: C语言中的结构体参数传递详解
18 0
|
5天前
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
14 0
|
1天前
|
C语言
malloc()函数
`malloc()`是C语言中的动态内存分配函数,用于分配指定大小的内存块,并返回一个`void*`类型的指针。要包含`stdlib.h`头文件来使用它。分配的内存大小以字节为单位,成功则返回内存首地址,失败则返回`NULL`。需要注意的是,返回的指针需强制转换为所需类型,并在使用后用`free()`释放内存,避免内存泄漏。切勿在分配区域内移动指针,以防止释放时出现问题。
|
3天前
|
Serverless C语言
C语言函数详解与实战应用
C语言函数详解与实战应用
7 1
|
3天前
|
算法 C语言
C语言函数递归调用详解与实战应用
C语言函数递归调用详解与实战应用
11 0
|
3天前
|
C语言
C语言函数的嵌套调用详解
C语言函数的嵌套调用详解
9 1
|
5天前
|
存储 C语言
向函数传递字符串: C语言中的技术与实践
向函数传递字符串: C语言中的技术与实践
14 0
|
5天前
|
程序员 C语言
使用指针变量作为函数参数的C语言程序实例
使用指针变量作为函数参数的C语言程序实例
14 0
|
5天前
|
C语言
C语言函数嵌套与递归调用的深入解析
C语言函数嵌套与递归调用的深入解析
13 0
|
5天前
|
存储 C语言
C语言中向函数传递值和从函数返回值的技术解析
C语言中向函数传递值和从函数返回值的技术解析
15 0