C语言之函数递归的实现

 更新时间:2023年07月05日 08:51:19   作者:iLoyo_  
本文主要介绍了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;
}

图解:

🍤实例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

3. 递归与迭代

3.1 求n的阶乘

//递归
#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…
从第三位开始,后一项等于前两项之和

//递归
#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;
}

注:
🍥 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
🍥 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
🍥 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

结束语

递归是函数实现的一个很重要的环节,我们不但要理解,还要掌握,能够熟练使用递归。

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

相关文章

  • C语言的字符空间与非字符空间你了解吗

    C语言的字符空间与非字符空间你了解吗

    这篇文章主要介绍了C语言的字符空间与非字符空间,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • C++中的变长参数深入理解

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的问题,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • Linux UDP服务端和客户端程序的实现

    Linux UDP服务端和客户端程序的实现

    这篇文章主要介绍了Linux UDP服务端和客户端程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C语言实现单词小帮手

    C语言实现单词小帮手

    这篇文章主要为大家详细介绍了C语言实现单词小帮手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • windows下如何安装OpenCL

    windows下如何安装OpenCL

    这篇文章主要介绍了windows下如何安装OpenCL,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • c++ 有趣的动态转换

    c++ 有趣的动态转换

    这篇文章主要介绍了c++ 动态转换的相关资料,帮助大家更好的理解和使用c++编程,感兴趣的朋友可以了解下
    2020-09-09
  • C++中各种类型数据标签分发传递详解

    C++中各种类型数据标签分发传递详解

    这篇文章主要介绍了C++中各种类型数据标签分发传递,类型标签分发是一种技术,它允许基于对象的类型来选择不同的函数重载,这种方法通常用于泛型编程中,特别是在处理不同类型的对象但又需要针对每种类型进行特定操作时,需要的朋友可以参考下
    2025-10-10
  • 关于C++继承你可能会忽视的点

    关于C++继承你可能会忽视的点

    继承是面向对象三大特性之一,有些类与类之间存在特殊的关系,下面这篇文章主要给大家介绍了关于C++继承你可能会忽视的点,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 详析C++中的auto

    详析C++中的auto

    这篇文章主要介绍了详析C++中的auto,auto是具有自动存储器的局部变量,C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而作为一个新的类型指示符来指示编译器,下面来看看文章的详细介绍吧
    2022-01-01
  • 详解C++ cin.getline函数

    详解C++ cin.getline函数

    这篇文章主要介绍了C++ cin.getline函数的相关资料,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-09-09

最新评论