C++算法递归

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

那么递归的内容呢就没有了,谢谢大家(鞠躬)!

  • 52
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值