【蓝桥杯学习记录】【2】递归与循环(2)递归的实际应用

递归的更强大的功用

在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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值