一、递归的定义

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

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

  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. MIPI DSI协议学习【转】

    本文转载自:http://www.voidcn.com/blog/LoongEmbedded/article/p-6109759.html 1.     MIPI DSI DSI:displayser ...

  2. spring配置hibernate映射文件-------通配符

    <!-- 这里一定要注意是使用spring的mappingLocations属性进行通配的 -->      <property name="mappingLocation ...

  3. java JSON 序列化类(List<Object> 转String)

    import com.alibaba.fastjson.JSONObject; import com.google.common.base.Preconditions; import com.goog ...

  4. hive学习1(hive基本概念)

    hive基本概念 hive简介 hive是什么 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 为什么使用hive 1)简单易上手.提 ...

  5. hihoCoder挑战赛27题目一 福字 (dp)

    题目: 一个n × n的矩阵,其中每个位置都是一个非负整数. 一个福字被定义成是大小为 k 的正方形,满足其中的每个位置上的数都恰好比他的左边的那个和上边的那个大1(如果左边或上边的那个不存在的话就无 ...

  6. apache实现http自动转为https

    1.确认此服务器apache已经配置过证书可以用https访问到 2.确认/etc/apache2/ports.conf 下有 Listen 80Listen 443(此条) 3.配置虚礼主机定将域名 ...

  7. js的值类型和引用类型

    (1)值类型:String.Boolean.Number.null.undefined.(原始值) var a = 2; var b = a; b=3; a ==>2; b  ==>3 原 ...

  8. JMeter 3.0 POST Body Data 中文乱码问题

    现象如下图所示:

  9. Centos Crontab查看状态和开启

    # service crond status crond is stopped # service crond start Starting crond # service crond status ...

  10. shell学习之常用技巧

    cut 切割,-d分隔符,-f指定段号,-c指定第几个字符.d,f用的多些. sort排序,-n按照数字排序,-r反排序. wc -l 查看文件行数. 大道至简,掌握常用的命令就可以了. uniq去重 ...