最近忙着打"新生杯"辩论赛,嘿嘿!!!我们打进四强了。😀
哥的丑照(陈词立论环节):👉
麻了,边紧张边憋笑!!!
忙里偷闲,又来给大家更新文章了。
------------------------前情提要:👉------------------------
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、气势不能输!!!
祝大家人生中第一场辩论都能交出满意的答卷,当然,享受过程,不必在乎结果。