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++ Qt开发之LineEdit单行输入组件的用法详解

    C++ Qt开发之LineEdit单行输入组件的用法详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用
    2023-12-12
  • C++实现LeetCode(101.判断对称树)

    C++实现LeetCode(101.判断对称树)

    这篇文章主要介绍了C++实现LeetCode(101.判断对称树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 使用C++ MFC编写一个简单的五子棋游戏程序

    使用C++ MFC编写一个简单的五子棋游戏程序

    这篇文章主要介绍了使用C++ MFC编写一个简单的五子棋游戏程序,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C/C++实现全排列算法的示例代码

    C/C++实现全排列算法的示例代码

    本文主要介绍了C/C++实现全排列算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C++实现LeetCode(309.买股票的最佳时间含冷冻期)

    C++实现LeetCode(309.买股票的最佳时间含冷冻期)

    这篇文章主要介绍了C++实现LeetCode(309.买股票的最佳时间含冷冻期),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言main函数的参数及其返回值详细解析

    C语言main函数的参数及其返回值详细解析

    main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出
    2013-10-10
  • c++超细致讲解引用

    c++超细致讲解引用

    引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样
    2022-05-05
  • C++ LeetCode542矩阵示例详解

    C++ LeetCode542矩阵示例详解

    这篇文章主要为大家介绍了C++ LeetCode542矩阵示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++中继承的概念和定义

    C++中继承的概念和定义

    这篇文章主要介绍了详解C++ 中的概念和定义,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • C/C++中static,const,inline三种关键字详细总结

    C/C++中static,const,inline三种关键字详细总结

    以下是对C/C++中static,const,inline的三种关键字进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09

最新评论