递归的更强大的功用
在n个球中,任意取出m个,求有多少种不同的取法
求n个元素的全排列
两个串的最大公子序列的长度
#include <iostream>
#include <cstdio>
#include <string.h>
#include <iomanip>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#define PI atan(1.0)*4
using namespace std;
int f(int n,int m)
{ //n个取m个
//想象n个里面有一个特殊的球x,取法划分为是否取球x
if(n < m) return 0;
if(n == m) return 1;
if(m == 0) return 1;
return f(n-1,m-1) + f(n-1,m);
}
void f_order_d(string data,int k)//k 最初始的长度
{
//if(data.length() == k)
cout << data << endl;
for(int i = 0; i < data.length(); i++)
{
{
char t = data[0]; data[0] = data[i]; data[i] = t;//交换 试探
}
f_order_d(data.substr(1),k);
//string s = data.substr(1);
{
char t = data[0]; data[0] = data[i]; data[i] = t;//
}
}
//
}
void f_order(string data,int k)//与自己交换就是不变的情况
{
//k 第k个与后面元素交换
if(k == data.length())//问题 : 到底应不应该 -1 ???
cout << data << endl;
for(int i = k; i < data.length(); i++)
{
{
char t = data[k]; data[k] = data[i]; data[i] = t;//交换 试探
cout << 1;
}
f_order(data,k+1);
{
char t = data[k]; data[k] = data[i]; data[i] = t;//回溯
cout << 0;
}
}
//
}
int f_sum(string s1, string s2)
{
if(s1.length() == 0 || s2.length() == 0)
return 0;
if(s1[0] == s2[0])
return f_sum(s1.substr(1),s2.substr(1)) + 1;
else
return max(f_sum(s1.substr(1),s2),f_sum(s1,s2.substr(1)));
//return f_sum(s1.substr(1),s2) > f_sum(s1,s2.substr(1)) ? f_sum(s1.substr(1),s2) : f_sum(s1,s2.substr(1));
/*
包含在c++标准库中头文件<algorithm>中,在头文件<windows.h>中定义了min,max的宏,
若在包含<algorithm>的同时包含<windows.h>会导致函数无法使用。
<windows.h>提供了_cpp_min等函数来代替min函数的功能。
algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数
*/
}
int main()
{
/*
//在n个球中,任意取出m个,求有多少种不同的取法
int k = f(5,2);//f(n,m);
cout << k << endl;
*/
/*
//求n个元素的全排列
//abc abc acb bac bca cab cba
string data = "abc";//cout << data.substr(1) << endl;
//f_order_d(data,3);未实现
f_order(data,0);
*/
/* */
//求两个串的最大公子序列的长度 (子串必须连着; 子序列可以不连着)
// abcdef abc abd bdf
//递归解决此类问题效率不高
//算法 : 可解 , 优化 (网上有巧妙的动态规划等解法)
int k = f_sum("abc","xbacd");// b c ------- 2 ;
cout << k << endl;
return 0;
}