C语言(十六)函数综合(二)递归 --- 辩论赛经验谈

最近忙着打"新生杯"辩论赛,嘿嘿!!!我们打进四强了。😀

哥的丑照(陈词立论环节):👉

麻了,边紧张边憋笑!!!

忙里偷闲,又来给大家更新文章了。

------------------------前情提要:👉------------------------

https://blog.csdn.net/2401_87025655/article/details/142734872

---------------------------你将收获:👉---------------------

递归! 是递归!! 还是递归!!!

  • "地龟"是啥,能吃吗?(递归的定义)
  • 如何理解递推与回归
  • 递归的示例
  • 递归的应用
  • 打人生中第一场正式辩论赛经验谈

------------------额外收获(穿插在其中):👉---------------

  • 高数题一道

一、递归的定义

++递是递推,归是回归++,递归是"地龟",嘿嘿。

递归的定义 --- 程序++调用自身++的技巧;

递归的作用 --- 把大型复杂问题化成重复的小问题解决。

递归的限制条件 --- 如下:

  • 递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
  • 每次递归调⽤之后越来越接近这个限制条件。

二、如何理解递推与回归

1、"递推" --- 前一个执行,带动后一个执行

++形象理解👉 1.1多米诺骨牌 --- 一个倒了,后面也跟着倒了++

++不形象的理解👉 1.2++ ++高数题一道(不看也行)++

2、"回归" --- 返回值

如果把递推比作由上级向下级逐级分配任务,那么回归就是由下级往上级逐级反馈工作效果。

三、递归的示例

1、计算 n!

已知

1!= 1 ,

2!= 1 * 2,

3! = 1 * 2 * 3,

······

求 n!

当然,用循环很容易解决,递归可能在本题没什么竞争力。

我们暂且用本题理解一下递归的思路。

++1.1递推思路举例👉++

cpp 复制代码
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1

++1.2递推图示理解👉++

++1.3回归图示理解 👉++

注:1!的结果给2!= 2 * 1!,2!的结果给3!= 3 * 2!,······

总之,从上往下为递推,从下往上为回归;递推为分解(化大为小),回归为整合(从下往上返回结果)。

++1.4代码示例👉++

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int fac(int x)
{
	if (x > 0)
	{
		return x * fac(x - 1);
	}
	else
		return 1;
}
int main()
{
	int n = 5;
	int ret = fac(n);
	printf("%d", ret);
	return 0;
}

++1.5综合图示👉++

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

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

⽐如:

输⼊:1234 输出:1 2 3 4

输⼊:520 输出:5 2 0

当然,用循环也可以解决,此处我们尝试用递归来解。

++2.1思路图示👉++

++2.2代码示例👉++

cpp 复制代码
#include <stdio.h>

void Print(int n)
{
	if (n <= 9)
	{
		printf("%d ", n);
	}
	else
	{
		Print(n / 10);
		printf("%d ", n % 10);
	}
}

int main()
{
	int n = 0;
	printf("请输入,你要打印的数字:>");
	scanf("%d", &n);
	Print(n);

	return 0;
}

++2.3代码示例(简化版)👉++

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
void Print(int n)
{
	if (n > 9)
	{
		Print(n / 10);
	}
	printf("%d ", n % 10);
}


int main()
{
	int n = 0;
	printf("请输入,你要打印的数字:>");
	scanf("%d", &n);
	Print(n);

	return 0;
}

++2.4运行结果👉++

cpp 复制代码
请输入,你要打印的数字:>12345
1 2 3 4 5

四、递归的应用

1、求第n个斐波那契数

斐波那契数列(Fibonacci sequence),又称黄金分割数列, 斐波那契数列是一个数字序列,其中每个数字是前两个数字的总和,其数值为:1、1、2、3、5、8、13、21、34......

++1.1思路👉++

因为从第三个斐波那契数列开始每一个数都是前两个数字之和,所以,我们很容易得到公式:👉

这个斐波那契数列是怎么"递推"出去的呢?

如果前一个执行,那么后一个执行,依次递推出去。

++1.2代码示例👉++

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int fib(int x)
{
	if (x > 2)
	{
		return fib(x - 1) + fib(x - 2);
	}
	else
	{
		return 1;
	}
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d", ret);
	return 0;
}

++1.3运行结果示例👉++

cpp 复制代码
10
第10个斐波那契数为55

++1.4补充:其它解法的拓展👉++

cpp 复制代码
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	
	int i = 0;
	for (i = 3; i <= n; i++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	return c;
}

2、小乐乐跳台阶

小乐乐上课需要走台阶,因为他腿比较长,所以每次可以选择走一阶或两阶,那么他一共有多少种走法?

输入描述:

输入一个整数n(1 ≤ n ≤ 30),表示台阶数

输出描述:

输出一个整数,即小乐乐可以走的方法数

++2.1思路分析👉++

  • 当 n =1 时,显然只有一种走法;n = 2 时,有1阶+1阶和直接2阶两种走法。
  • 当 n > 2 时,假设有10个台阶 (n为假设的台阶数)。那么第一步走了1阶,还剩9阶;走了2阶,还剩8阶。
  • 也就是说,如果对于n阶台阶,如果小乐乐第一步走一阶,则走法种数只需要考虑剩下的 (n - 1)阶;如果小乐乐第一步走两阶,则走法种数只需要考虑剩下的 (n - 2)阶。

++2.2代码示例👉++

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 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 m = fib(n);
    printf("%d阶台阶的走法有%d种\n",n, m);
    return 0;
}

++2.3运行结果👉++

cpp 复制代码
4
4阶台阶的走法有5种

五、打人生中第一场正式辩论赛经验谈

1、要先与队友构建逻辑链,再写稿;

2、一辩稿:定义+判准+总论点(如:XXX利大于弊)+两到三个分论点

3、各辩位主要任务:一是攻击对方的论,二是推自己的论。(队友之间相互合作,沿着已经构建好的逻辑链进行推己方的论 ---- 两个论点的话,就是把论一和论二推完)

4、有效攻防点:如果要抓住某个点作为得分点,注意要-----除了抛问、质疑,还要进一步阐释,并回归到己方的论/逻辑链。

5、思路要清晰

各辩位要明确己方已经在与对方辩论的过程中打下了哪些战场(争辩的点),配合清晰的 "行为",如:"驳"、"结"、"问"······

如:盘问后的小结可以说:"在刚才的辩论中,我方与对方辩友打成了XX共识"

这样做是为了让评委知道你在做什么,加印象分和技巧分。

6、盘问

有时候不要直白地问,套上情景再去问。

7、气势不能输!!!

祝大家人生中第一场辩论都能交出满意的答卷,当然,享受过程,不必在乎结果。

相关推荐
无际单片机项目实战1 小时前
为什么STM32的HAL库那么难用,ST还是要硬推HAL库?
c语言·stm32·单片机·嵌入式硬件·物联网
小卡皮巴拉2 小时前
【力扣刷题实战】相同的树
c语言·算法·leetcode·二叉树·递归
爱编程— 的小李3 小时前
开关灯问题(c语言)
c语言·算法·1024程序员节
极客代码3 小时前
C/C++ 随机数生成方法
c语言·开发语言·c++·算法
TeYiToKu5 小时前
笔记整理—linux驱动开发部分(1)驱动梗概
linux·c语言·arm开发·驱动开发·嵌入式硬件
DdddJMs__1356 小时前
C语言 | Leetcode C语言题解之第517题超级洗衣机
c语言·leetcode·题解
边疆.6 小时前
C++类和对象 (中)
c语言·开发语言·c++·算法
林浔09067 小时前
C语言部分输入输出(printf函数与scanf函数,getchar与putchar详解,使用Linux ubuntu)
c语言·开发语言
blessing。。8 小时前
__attribute__ ((__packed__))
linux·c语言·arm开发
长潇若雪8 小时前
结构体(C 语言)
c语言·开发语言·经验分享·1024程序员节