[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 ...
随机推荐
- nodejs实现静态托管
const express = require("express"); const app = express(); /* 语法1: app.use(express.static( ...
- Redux API之bindActionCreators
bindActionCreators(actionCreators,dispatch) 把 action creators 转成拥有同名 keys 的对象,但使用 dispatch 把每个 actio ...
- mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
1. ERROR 1067 (42000): Invalid default value for 'FAILD_TIME' (对TIMESTAMP 类型的子段如果不设置缺省值或没有标志not n ...
- hadoop 知识点总结
关于元数据的checkpoint 每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过 ...
- UVA 11186 Circum Triangle (枚举三角形优化)(转)
题意:圆上有n个点,求出这n个点组成的所有三角形的面积之和 题解: 当我们要求出S(i,j,k)时,我们需要假设k在j的左侧,k在i与j之间,k在i的右侧. 如果k在 j的左侧 那么 S(i,j,k ...
- Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
items为任意数组
- 机器学习三剑客之Numpy
Numpy NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Numpy内部解除了Python的PIL(全局解释器锁),运算效 ...
- Composer 入门使用手册
依赖管理 官网地址:http://docs.phpcomposer.com/00-intro.html#Locally Composer 不是一个包管理器.是的,它涉及 "packages& ...
- 搜索7--noi1804:小游戏
搜索7--noi1804:小游戏 一.心得 二.题目 1804:小游戏 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一天早上,你起床的时候想:“我编程序这 ...
- 调用摄像头并将其显示在UGUI image上自适应屏幕大小
参考链接:http://www.cnblogs.com/Erma-king/p/5869177.html 不过该博主是竖屏,我的是横屏 代码修改: using UnityEngine; using S ...