1、递归的准备
准备内容
学会定义函数、调用函数。
对函数有初级的认识。
推荐准备博客
2、递归的概念
先给大家讲个故事:
从前有座山,山里有个小和尚,有一天师傅给他讲了一个故事:从前有座山,山里有个小和尚,有一天师傅给他讲了一个故事:从前有座山,山里有个小和尚,有一天师傅给他讲了一个故事……
可以了,听完了,大家是不是很绕,这就是递归:故事里面有故事2,故事2里又有故事3……
而递归就是函数里调用函数,俗称:自己调用自己。只要记住这6个字,你递归的概念就学会了!
3、递归函数的各个部分
以下是个递归函数:
void f(int x){
if(x==0){
return 0;
}
f(x-1);
}
我们可以发现这个函数的部分有这几个组成:
判断、执行代码漏了、函数调用这几个部分。
但,这只是它们的语法,那它们在递归中代表什么呢?为大家列了一个表格(纯属自己想法)
语法 | 在递归中代表的部分 |
判断if | 终止条件 |
执行代码 | 运行代码 |
函数调用 | 递归函数 |
4、各部分的作用
1、判断if
我们先试一段代码,不含终止条件
void f(){
cout<<"hello digui"<<endl;
f();
}
试了之后,成功造成死循环,根本停不下来。
为什么呢?比如说你是一个小偷,干了坏事,但没人管你,你会不会一直干下去?答案是会。(打个比喻,请勿当真)
这就是为什么,因为没有人去限制它,所以,它才会一直循环下去。
2、函数调用
这个部分是递归里最重要的部分了,回顾递归的概念,那句口诀:自己调用自己正是指的函数调用。
所以,函数调用,调用的是那部分,应该清楚吧。
5、递归的优点
递归它最牛的地方就在于它简洁、精炼。
看一道题目你就知道了。
题目描述:
小明特别喜欢吃烤全羊,小明吃烤全羊很特别,为什么特别呢?因为他有 10 种配料(芥末、孜然等),每种配料可以放 1到 3 克,任意烤全羊的美味程度为所有配料质量之和。
现在, 小明想要知道,如果给你一个美味程度 n ,请输出这 10 种配料的所有搭配。
看到这道题的时候,大部分人会选择写10个循环去穷举,巴拉巴拉一大长串,如果我把10换成100,甚至成千上万,那怎么办呢?
我敢肯定,有至少⅓的人破防了,毕竟谁爱写几百个循环啊。
换个角度思考呢?看一下有没有特定的算法?没有。
代码思路:
这时,递归闪亮登场!
怎么写呢?先写一个递归函数,再在递归函数里面去把所有的可能(1~3克),枚举一遍,如果到了100(或更大的数),就停下,然后去判断这个方案行不行,行就输出,不行就清空。
代码答案
代码(10种):
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int a[N],n,flag,res;
void f(int x,int sum){
if(x==11){
if(sum==n){
res++;
if(flag==1){
for(int i=1;i<=10;i++)cout << a[i] <<' ';
cout << endl;
}
}
return;
}
for(int i=1;i<=3;i++){
a[x]=1;
f(x+1,sum+i);
}
}
int main(){
cin >> n;
if(n<10||n>30){
cout << '0'<<endl;return 0;
}
f(1,0);
flag=1;
f(1,0);
return 0;
}
然后,这道题就被K.O啦。
大家觉得那个解法更好呢?是暴力还是递归?
那么文章底部有一个投票,大家可以参加投票哦。ヾ(≧▽≦*)o
那么递归的内容呢就没有了,谢谢大家(鞠躬)!