一、递归的定义

  一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解。

二、用递归求解问题的主要步骤

  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++] 递归之全排列问题、半数集的更多相关文章

  1. 递归实现全排列序列C语言实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...

  2. JAVA递归实现全排列

    全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例 ...

  3. 递归实现全排列python

    python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",st ...

  4. Java用递归实现全排列,详细

    package edu.cqu.algorithmTest; import java.util.Scanner; // 全排列,递归实现 public class Main8 { public sta ...

  5. NEFU 560 半数集

    题目链接 递推就行,把a[0]设为1很巧妙. #include <cstdio> #include <iostream> using namespace std; ]={}; ...

  6. python非递归全排列

    刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...

  7. 利用递归生成组合数C(n,m)

    /*===================================== 数的组合问题.从1,2,…,n中取出m个数,将所有组合按照字典顺序列出. 如n=3,m=2时,输出: 1 2 1 3 2 ...

  8. 基于visual Studio2013解决面试题之0708字符串全排列

     题目

  9. C语言实现全排列和回溯法总结

    一.递归实现全排列 #include"cstdio" ]; void print_permutation(int n,int *A,int cur){ if(cur==n){ ;i ...

随机推荐

  1. CSS3 3D旋转下拉菜单

    在线演示 本地下载

  2. NoSQL数据库memcache和redis区别

    在web后台发开面试中,经常会被问道memcache和redis的区别和使用情况. 其中memcache和redis都是基于内存存储的缓存系统,存储形式key--value键值对的形式. 区别: 1. ...

  3. HashSet,TreeSet和LinkedHashSet的区别

    1. Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个 ...

  4. PostgresSQL数据库安装及操作

    PostgreSQL介绍 PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQL(也称 ...

  5. maven deploy 代码

    Run As --> Run Configurations ---> Maven Build --->New _Configuration(双击Maven Build可生成) --& ...

  6. python模块cgihttpserver启动

    cgi是web服务器运行web应用的一种机制,web服务器通过执行cgi脚本,然后将该程序的标准输出作为http响应的一部分 CGIHTTPServer是python标准模块的web服务器,它可以运行 ...

  7. codeforces459D:Pashmak and Parmida's problem

    Description Parmida is a clever girl and she wants to participate in Olympiads this year. Of course ...

  8. hdu 5663 Hillan and the girl 莫比乌斯反演

    Hillan and the girl Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/O ...

  9. 微信内置浏览器http请求10秒内接收不到数据会自动重发第二遍请求

    微信内置浏览器http请求10秒内接收不到数据会自动重发第二遍请求     这是个坑

  10. 书_Delphi

    1. 有讲 坦克大战 的那本Delphi叫什么 叫做:<<Delphi深度历险>> 2.