【C语言】题目21 - 假设输入数字5,实现1+2+3+4+5=16,同样输入任何数字产生这样每个数字相加之和(递归方法实现)

128 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

Hello,大家好,我是泽奀,一起学习进步(●'◡'●)。
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

前言

“一个积极的悲观主义者,有时候把事情想象的很糟糕,想多了就影响情绪,好像末日要来临,整个人的情绪不好,坏情绪泛滥,精神都颓废了,结果事情的结果却很好,自己吓唬自己。 无论你现在处于什么样的状态,低谷期也好,平淡期也好,我都希望你具有乐观向上的心态,敢于面对生活中的不如意,并且不畏惧抬头朝前走,山高路远务必保持善良乐观“-来自知乎上的送给自己。

题目描述

假设输入数字5,实现1+2+3+4+5=16,同样输入任何数字产生这样每个数字相加之和(递归方法实现)

题目分析

这道题目实际上和我们做过的题目15可以说是一模一样的,无非就是从阶层变成相加之和,也是非常容易,再来复习下递归概念

程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中是广泛应用的。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题转换位一个与原问题相似的规模较小的问题来去进行求解,递归策略只需少了的程序就可以描述出解题的过程所需要的多次重复计算,大大减少了程序的代码量。递归的人主要思考方式就在于:把大事化小。递归之所以能够实现,是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和和该函数的其它执行过程是不会发生关系的。

注意:当递归进入到最内层的时候,递归就结束了,就开始逐层退出了,也就是逐层执行 return 语句。当执行最后层的 return 之后,就执行上面一层的递归!

再来说说递归的条件如下↓

  • 每一个递归函数都应该只进行有限次的递归调用,否则它就会进入死胡同,永远也不能退出了,这样的程序是没有意义的。

  • 存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。

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

题目代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int recursion(const int number)
{
	if (number <= 1)
		return 1;
	else
		return number+recursion(number - 1);
}
int main(void)
{
	int number = 0;
	printf("请输入数字:");
	scanf("%d", &number);
	int ret = recursion(number);
	printf("ret = %d\n", ret);
	return 0;
}

运行结果

请输入数字:5
ret = 15

1+recursion(0) = 1
2+recursion(1) = 3
3+recursion(3) = 6
4+recursion(6)=10
5+recursion(10)=15

那我们试试不用递归来做下这道题目,其实也是很容易的。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int sum = 0;//总数
	int i = 0;
	int input = 0;//输入
	printf("请输入数字:");
	scanf("%d", &input);
	for (i = 0; i <= input; i++)
	{
		sum = sum + i;
	}
	printf("sum = %d\n", sum);
	return 0;
}

最后

不知道你对递归的理解怎么样,说真的递归这玩意不要把它看的过于复杂,无非就是自身调用自身,调用的过程化繁为简就可以了╰(‵□′)╯