[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 ...
随机推荐
- centos_mysql5.6.21_rpm安装
1.查看操作系统相关信息.[root@linuxidc ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@l ...
- STAR manual
来源:STARmanual.pdf 来源:Calling variants in RNAseq PART0 准备工作 #STAR 安装前的依赖的工具 #Red Hat, CentOS, Fedora. ...
- JSON解析字符串
JSON解析字符串 JSON 解析字符串时,应按严格的标准,否则无法解析: str1 = '{"str":"string","number" ...
- R中读取EXCEL 数据的方法
最近初学R语言,在R语言读入EXCEL数据格式文件的问题上遇到了困难,经过在网上搜索解决了这一问题,下面归纳几种方法,供大家分享: 第一:R中读取excel文件中的数据的路径: 假定在您的电脑有一个e ...
- The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
要解决的话,方法有两个 1)可以选用较低版本的sdk,比如我就用回1.6版本的sdk window->preferences->Java->Installed JREs->Ad ...
- zhly
5. 百叶002 名字2008 1.新浪 阿里矢量图库账号 15031116087 名字2008 2.acdsee 账号 1173209945 同密码一样 3.zhly 我的名字2016 ...
- jstl: <c:url> 标签
这个标签主要是用来重写 URL 地址.它的使用格式如下所示:<c:url value=”value” [context=”context”] [var=”varName”] [scope=”pa ...
- ComboBoxStyle和ToggleButton
<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}"> <Setter ...
- poj2135最小费用流
裸题,就是存个模板 最小费用流是用spfa求解的,目的是方便求解负环,spfa类似于最大流中的bfs过程 #include<map> #include<set> #includ ...
- mac实用脚本
安全清倒废纸篓(AppleScript) on run {input, parameters} set title to "安全清倒废纸篓" set trashIsEmptyMes ...