首页 > 编程语言 >算法竞赛备赛之浅谈递归

算法竞赛备赛之浅谈递归

时间:2022-10-06 15:01:15浏览次数:53  
标签:浅谈 递归 int 备赛 dfs 枚举 include 节点

递归

递归需要有基例递归前进段递归返回段(return语句),是一种程序设计技巧,可以使程序编写简单,但实际上要付出低效率的代价

计算时间复杂度常用数据的记忆(程序设计基本功,由于递归的低效,所以在程序设计的时候更要注意)

\(2^{20}\approx10^6\)
\(2^{16}=65536\)
\(2^{15}=32768\)
\(2^{63} \approx 10^{18}\)

用递归实现枚举操作

递归的数据结构表现之一为递归搜索树,因此在写递归函数的时候,我们通常把他们取名为dfs()(这也说明了在枚举这一操作中遍历这种树的办法常常是dfs),在使用递归来进行枚举操作的时候,我们会从第一个步骤开始依次枚举不同的情况,生成由所有步骤组成的二叉树,再对树进行深度优先搜索,搜索到的每一个分支的最后的子节点就应该是问题的答案。

这里有两点值得注意:
1.在实际的程序运行中,我们并不是将二叉树生成完毕后,再对其进行深度优先遍历操作,而是在生成完父节点的子节点之后,对于已经完成当前分支情况的枚举结果的生成的分支进行回溯之后,对父节点进行**恢复现场**操作,将其状态重新变成未搜索状态,并进一步生成另外的一个子节点,重复这一过程。
2.由于有对时间复杂度的要求,在某些情况下,我们会对一些对结果不重要或者冗余的分支进行剪枝操作(实现一般也是寻找或构造出此种分支的特殊状态,用条件结构判断),这是降低时间复杂度的有效办法。

例题:
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
数据范围
1≤n≤15

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N=16;
int n;
int st[N];
//递归函数表示的是树的父节点的每一个子节点的生成逻辑,要抽象出逻辑来进行程序设计,不能简单地用顺序结构去理解,应该是(顺序结构+循环+迭代)(不太准确但好懂)
void dfs(int u)
{
	//递归返回段
        if (u>n)
	{
		for(int i=1;i<=n;i++)
			if(st[i]==1)
				printf("%d ",i);
		printf("\n");
		return;
	}
        //这两个分支是递归前进段:
        //分支1:
	st[u]=2;
	dfs(u+1);
	st[u]=0;
        //分支2:
	st[u]=1;
	dfs(u+1);
	st[u]=0;
}

int main()
{
	cin >> n;
	dfs(1);//这是基例
	return 0;
}

标签:浅谈,递归,int,备赛,dfs,枚举,include,节点
From: https://www.cnblogs.com/xiaohoulaoyue/p/16757616.html

相关文章

  • 浅谈树链剖分
    树链剖分是把一棵树分割成若干条链,以便于维护信息的一种方法,其中最常用的是重链剖分(HeavyPathDecomposition,重路径分解),所以一般提到树链剖分或树剖都是指重链剖分。除此......
  • 程序员必备的基本算法:递归详解
    前言递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要了,这也是为......
  • Java方法(递归)
    递归就是A方法调用A方法,就是自己调用自己利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求......
  • Fibnacci数列递归实现
    什么Fibnacci数列通过查阅斐波那契数列,其中,它是这么说的:斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例......
  • 【Vue3.x】全局组件、局部组件和递归组件
    全局组件没啥讲的,和vue2一样,常规是src下components文件夹下新建全局组件,然后去入口文件main.ts里注册全局组件。然后就能在全局使用了import{createApp}from'vue'i......
  • (函数)用递归实现求阶乘函数fact(n)的功能,即求1*2*……*n,运行后输出结果如下
    样例输入5 样例输出12 样例输入6 样例输出720 参考答案deffact(n):result=1foriinrange(1,n+1):result*=ireturnresultn=i......
  • 原始递归函数及模拟运行的优化
    看到网上一个题目,证明x开y次方是原始递归函数(primitiverecursivefunction)。这个问题并不难,只要把x开y次方实现出来即可。于是,正好把《递归论》相关内容补一补。【......
  • 理解递归与循环
    一、递归与循环的对比递归会带来大量的函数调用。这是不好的在计算环节特别大的前提下,递归就是不好的,因为递归是先调用,再计算。在大量计算的前提下可能会造成栈溢......
  • 函数的递归调用
    介绍:一个函数在函数体内又调用了本身,称之为递归调用例子:  ①当在函数main内调用test(4)时,执行判断if,由于4>2,执行test(n-1),此时n=4,则传值为test(3)②继续执行判断if......
  • 浅谈JVM模型以及Class文件是怎么被加载的
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档@目录前言一.什么是JVM二、JVM类加载机制1.类加载的概念2.类加载具体流程3.类加载器4.双亲委派机制4.1......