首页 > 其他分享 >函数递归的学习1

函数递归的学习1

时间:2024-09-11 21:51:16浏览次数:3  
标签:return 函数 递归 int 学习 test include

了解递归

递归是什么

1.在C语言中,递归就是函数自己调用自己。

递归的思想

把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。所以递归的思考方式就是把大事化小的过程。 递归中的递就是递推的意思,归就是回归的意思。

递归的注意要点

1.递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。

 每次递归调用之后越来越接近这个限制条件。

2.确保递归能到达所设条件,避免无限递归。

#include <stdio.h>
int main()
{
 printf("hehe\n");
 main();  //main函数中⼜调⽤了main函数 
 return 0;
}

如这段代码没有设置限制条件,就会死循环打印 ''hehe'',最终导致栈溢出。

学习的简单例子

1.求n的阶乘

1). n的阶乘可以有循环简单求出。下面可以正确的求得 5 的阶乘为 120。

#include <stdio.h>
int test(int n)
{
	int ret = 1;
	for (int i = 1; i <= n; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int n = 0;
    scanf("%d",&n);
	int num = test(n);
	printf("%d", num);
	return 0;
}

2).也可以用使用递归的方法

#include <stdio.h>
int test(int n)
{
	if (n == 1)     //代码的限制条件
		return 1;
	else return n * test(n - 1);   //每一次递归,更接近n为1的这个条件
}
int main()
{
	int n = 5;
    scanf("%d",&n);
	int num = test(n);
	printf("%d", num);
	return 0;
}

在 test 函数中,当不满足 n 为 1 这个限制条件时,函数就会不断递推,每一次递推 n 就减一,当 n 为一时,函数就开始回归,最后将所得的结果,作为函数最后的返回值,函数调用完成。

 

顺序打印⼀个整数的每⼀位

输⼊⼀个整数m,按照顺序打印整数的每⼀位。比如:

输⼊:1234输出:1 2 3 4

输⼊:520 输出:5 2 0 

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

对于一个数,对它模 10 就可以得到它的最低位;每得到一次它的最低位,都对它除以 10,就可以得到它每一位上的数字。通过递归,就可以实现这一段代码。

在递归中,函数自己调用自己,不满足限制条件时,一步步执行递推的过程;

满足限制条件后,再逐步回归,将每一次调用函数后的回归的步骤执行,使函数整体的运行完成。

典型例子 -- 求第n个斐波那契数

1.递归的实现

这是求解斐波那契函数的数学公式。即第一位和第二位为 1,之后的每一位都等于前两个数之和。

根据公式可以很容易的写出代码。

#include <stdio.h>
int Fib(int n)
{
	if (n <= 2)         //公式的
		return n;       //代入
	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;
}

但是当n较大时,这段代码的效率就没有那么高,在递归的不断展开中很多数不断重复出现,导致计算机运行大大降低,我们可以测试一下计算第 40 个斐波那契数时,2 出现的次数。

#include <stdio.h>
int count = 0;
int Fib(int n)
{
	if (n == 2)
		count++;
	if (n <= 2)
		return n;
	else return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	printf("%d\n", count);
	return 0;
}

单单是数字 2 出现的次数都有六千多万次,这无疑大大降低了运算效率。

以迭代的方式求解斐波那契数。

因此,为了提高效率,我们可以用迭代的方式求解斐波那契数。

#include <stdio.h>
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	if (n < 3)
		return 1;
	else
	{
		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;
}

在这个代码中,我们可以瞬间算出较大的斐波那契数,如上述的第 55 个斐波那契数,但以递归实现的函数要计算第 55 斐波那契数则需要较长的等待。

所以在实现代码时,应考虑其运行效率,合理选择实现代码的方式。

。。。

标签:return,函数,递归,int,学习,test,include
From: https://blog.csdn.net/2402_86767488/article/details/142070702

相关文章

  • 专业学习计划(校内社团使用)
    前言:在本科阶段想要搞好竞赛,学习能力其实最为重要,网络上有大把的学习资源(B站、书本、CSDN以及Github等),自学能力很重要!自学能力很重要!自学能力很重要!!!在掌握部分知识之后要积极参加一些实践项目(不管多小、做好就可以)。最后的最后不要不敢与尝试,迈开第一步尤为重要。文章分为两......
  • AGI时代,程序员想学习大语言模型(LLM),应该从哪里开始?
    一、怎样学好,并应用大模型AGI(ArtificialGeneralIntelligence,通用人工智能)时代,懂AI、懂编程、懂业务的超级个体,会是AGI时代最重要的人。为了成为这样的超级个体,我们需要在哪几个方向发力呢?那就是:原理、实践和认知。不懂原理就不会举一反三,走不了太远。不懂实践就只能纸上......
  • 【自用22.】C++类的静态数据成员以及静态成员函数
    需要获取总的人数,如何实现?方案一:使用全局变量,在构造函数中对这个全局变量进行修改具体代码如下:在Human.cpp中定义全局变量,并在构造函数中对人数进行增加操作#include"Human.h"#include<iostream>usingnamespacestd;intHumanCount=0;Human::Human(){ name......
  • 【小白深度教程 1.16】手把手教你使用 Pytorch3D(1)使用 3D 损失函数来拟合 Mesh
    【小白深度教程1.16】手把手教你使用Pytorch3D(1)使用3D损失函数来拟合Mesh1.安装和导入模块2.加载.obj文件并创建Mesh对象3.可视化源Mesh和目标Mesh4.迭代优化进行拟合5.可视化损失6.保存结果在这篇文章中,我们将学习如何使用3D损失函数变形源......
  • SQL学习笔记
    SQL注入原理SQL注入原理就是跟SQL语法有关的一种攻击手段。如果在编写代码时没有对提交的参数进行严格过滤和判断,通过在客户端提交参数时拼接SQL语句,提交至服务端,服务端将拼接的SQL语句提交给数据库执行,泄露数据库中的信息并返回给服务端,再返回给客户端,从而获得信息或者执行危险......
  • 学习《领域驱动设计-软件核心复杂性应对之道》的过程随笔
    本随笔谨用于记录本人学习《领域驱动设计-软件核心复杂性应对之道》的过程和收获,愿与大家共享之初写于2024.07.24,学习未竟,随笔伴行-- 本人于工作期间阅读该书,发现很多值得反复学习的方法和思考方式,随笔记录;兴之所至,兴尽即止---本文是针对面向对象开发人员所编写的,如不合适,请......
  • kissat的多输出-学习与修改1
    学习:传播、回溯、重启 //propsearch.h中定义以下引用标识符#definePROPAGATE_LITERALsearch_propagate_literal#definePROPAGATION_TYPE"search"  //proplit.h中给出完整传播函数定义——对于了解文字传播队列非常重要1staticinlineclause*PROPAGATE......
  • TensorFlow深度学习框架改进K-means、SOM自组织映射聚类算法及上海招生政策影响分析研
    全文链接:https://tecdat.cn/?p=37652 原文出处:拓端数据部落公众号 分析师:ChenZhang 在教育政策研究领域,准确评估政策对不同区域和学生群体的影响至关重要。2021年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整,其中名额分配综合评价模块的变化尤为......
  • STM32学习笔记——中断
    中断:在主程序运行过程中,出现了特定事件(例如发生已经预知的一些情况),从而转入中断程序中,处理完成后再回到主程序中继续执行。(频繁的中断函数会影响主程序的运行,所以中断函数一边不处理特别复杂的逻辑)EXTI(ExternInterrupt)外部中断支持的触发方式:上升沿/下降沿/双边沿/软件触发支......
  • prometheus学习笔记之基于三方exporter实现监控
    一、redis_exporter通过redis_exporter监控redis服务状态git地址:https://github.com/oliver006/redis_exporterdocker地址:https://hub.docker.com/r/oliver006/redis_exporter实验环境:redisk8部署prometheus二进制部署1.redis_exporter使用简解二进制部署prometheus......