[C++] 递归之全排列问题、半数集
一、递归的定义
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解。
二、用递归求解问题的主要步骤
1、找出相似性
2、定义出口
三、递归实例
1、全排列问题
例如:
list[3] = {1,2,3}。
则全排列结果为:{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,2,1},{3,1,2}。
#include<iostream>
using namespace std; void Perm(int list[], int k, int m);
void Swap(int &a, int &b); void Perm(int list[], int k, int m)
{//产生list[k:m]的所有排列
if(k == m)
{ //只剩下1个元素
for(int i = ; i <= m; i++)
cout<< list[i];
cout<<endl;
}
else //还有多个元素待排列,递归产生排列
for(int i = k; i <= m; i++)
{
Swap(list[k], list[i]);
Perm(list, k+, m);
Swap(list[k], list[i]);
}
} void Swap(int &a, int &b)
{
int temp = a; a = b; b = temp;
} int main()
{
int list[] = {,,};
Perm(list, , );
return ;
}
2、重复元素全排列
例如:
list[4] = {1,1,2,2}。
则重复元素全排列结果为:{1,1,2,2},{1,2,1,2},{1,2,2,1},{2,1,1,2},{2,1,2,1},{2,2,1,1}。
#include<iostream>
using namespace std; void Perm(int list[], int k, int m);
void Swap(int &a, int &b);
bool ok(int list[], int k, int i); void Perm(int list[], int k, int m)
{//产生list[k:m]的所有排列
if(k == m)
{ //只剩下1个元素
for(int i = ; i <= m; i++)
cout<< list[i];
cout<<endl;
}
else //还有多个元素待排列,递归产生排列
for(int i = k; i <= m; i++)
{ //若不重复则执行
if(ok(list, k, i))
{
Swap(list[k], list[i]);
Perm(list, k+, m);
Swap(list[k], list[i]);
}
}
} void Swap(int &a, int &b)
{
int temp = a; a = b; b = temp;
} //判断元素[k..i-1]与i是否重复
bool ok(int list[], int k, int i)
{
if(i > k)
{
for(int t = k; t < i; t++)
{
if(list[t] == list[i])
return false;
}
}
else
return true;
} int main()
{
int list[] = {,,,};
Perm(list, , );
return ;
}
3、半数集
在自然数 n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半。
set(6) = {6,16,26,126,36,136},半数集 set(n) 的元素个数。
#include<iostream>
using namespace std; //递归算法
int comp(int n)
{
int ans = ;
if(n > )
{
for(int i = ; i <= n/; i++)
ans += comp(i);
}
return ans;
} /*
记忆式搜索方法
该方法用数组 a 来记录已经算过的半数集元素个数,
当输入的n在之前计算过时,则直接输出a[n]即可
*/
int a[];
int comp2(int n)
{
int ans = ;
if(a[n] > )
return a[n]; for(int i = ; i <= n/; i++)
ans += comp2(i);
a[n] = ans;
return ans;
} int main()
{
int n;
cin>> n;
int ans = comp(n);
cout<< ans <<endl; int ans2 = comp2(n);
cout<< ans2 <<endl;
return ;
}
[C++] 递归之全排列问题、半数集的更多相关文章
- 递归实现全排列序列C语言实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...
- JAVA递归实现全排列
全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例 ...
- 递归实现全排列python
python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",st ...
- Java用递归实现全排列,详细
package edu.cqu.algorithmTest; import java.util.Scanner; // 全排列,递归实现 public class Main8 { public sta ...
- NEFU 560 半数集
题目链接 递推就行,把a[0]设为1很巧妙. #include <cstdio> #include <iostream> using namespace std; ]={}; ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- 利用递归生成组合数C(n,m)
/*===================================== 数的组合问题.从1,2,…,n中取出m个数,将所有组合按照字典顺序列出. 如n=3,m=2时,输出: 1 2 1 3 2 ...
- 基于visual Studio2013解决面试题之0708字符串全排列
题目
- C语言实现全排列和回溯法总结
一.递归实现全排列 #include"cstdio" ]; void print_permutation(int n,int *A,int cur){ if(cur==n){ ;i ...
随机推荐
- 13.常见模块re-正则模块
1.正则 正则表达式是计算机科学的一个概念,正则表通常被用来检索.替换那些符合某个模式(规则)的文本.也就是说使用正则表达式可以在字符串中匹配出你需要的字符或者字符串,甚至可以替换你不需要的字符或者字 ...
- Oracle 数据库 INTERVAL DAY TO SECOND类型的使用
INTERVAL DAY TO SECOND类型可以用来存储单位为天和秒的时间间隔.下面这条语句创建一个名为promotions的表,用来存储促销信息.promotions表包含了一个INTERVAL ...
- Mybatis-config.xml配置文件详解
1.官方给出的案列: 注意:这些配置在文件中的顺序非常重要!必须严格按照上图中出现的顺序定义 2.properties属性 该属性主要作用就是引入外部的properties是文件,文件格式为xxx=x ...
- OpenStack with Opendaylight Part 1: Intro to Pipeline
Using Vagrant to create vm nodes; devstack to start openstack using Opendaylight as ML2. Openstack w ...
- Bellman-Ford算法 O(NE)
Bellman-Ford算法 O(NE) 思路:枚举n-1次所有边,通过枚举所有边,将所有和已知点相连的点都设为已知,初始时起点为已知点. ;i<=n-;i++){ //n-1是次数,枚举n-1 ...
- dp4--codeVs1043 方格取数
dp4--codeVs1043 方格取数 一.心得 二.题目 1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Dia ...
- 《Think in Java》(九)接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法: 抽象化类则是普通类与接口之间的一种中庸之道: 涨姿势了 接口也可以拥有值属性,但它们都是隐式的 static 和 final 的: 接 ...
- 04-dotnetCore博客后台基本功能实现
今天继续上篇博客的内容,在上一篇的时候,已经基本实现了博客列表内容的显示,继续进行添加.编辑.删除等功能.添加和编辑界面共用一个界面,添加界面如图所示: 同样我这里使用的还是layui里面的表单内容, ...
- c#加密,java解密(3DES加密)
c#代码 using System; using System.Security; using System.Security.Cryptography; using System.IO; using ...
- jmeter-察看结果树-响应数据,中文显示乱码问题处理
第一步: 打开路径:jmeter\bin\jmeter.properties 文件 第二步: 文件中默认编码为:ISO-8859-1 修改为utf-8 sampleresult.default.enc ...