【蓝桥杯学习记录】【3】递归与循环(3)递归真题

构建递归的要诀:
1.找到相似性 

2.定义出口


/** 反转串 **/

// 我们把 "cba" 称为 "abc" 的 反转串


/** 杨辉三角形 **/ //(a+b)的n次幂的展开式中各项的系数很有规律  n = 2, 3, 4的时候分别是
//1 2 1, 1 3 3 1, 1 4 6 4 1. 
/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

*/


/** 计算m个A n个B 可以组成多少种不同的全排列 **/


/** 整数的划分 **/


/** 财务部门报账错误问题 **/

//整数的划分问题未完全格式化输出 找不到相关资料 
//财务部门报账错误问题未完全格式化输出 示例的输出“3,4”, “4, 3”其实不同 不是一个“3” 

#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;

string reverseString(string x)
{
	if(x == "" || x.length() < 2)
		return x;
	return reverseString(x.substr(1)) + x[0]; //填空题 此处设空 return __________ + x[0];
}

int yanghuiAngle(int m, int n)
{
	if(m == 0) 
		return 1;
	if(n == 0 || n == m)
		return 1;
	return yanghuiAngle( m-1, n-1) + yanghuiAngle( m-1, n);//填空题 此处设空 return __________;
}

void yanghuiAngle_out(int level)
{
	for(int i = 0;i <= level;i++)
	{
		for(int s = level - i; s >= 0; s--)
		{
			cout << ' ';
		}
		for(int j = 0;j <= i;j++)
		{
			cout << yanghuiAngle(i,j) << ' ' ;
		}
		cout << endl;
	}
}

int ab(int m, int n)
{
	if(m == 0 || n == 0)
		return 1;
	return ab(m - 1,n) + ab(m, n-1);//填空题 此处设空 return __________;
}

bool sort_order(int a[],int k)
{
	int flag = 1;
	for(int i = 0; i < k; i++)
	{
		if(a[i] < a[i+1])
			flag = 0;
	}
	return flag;
}

void split_int(int n, int a[], int k)//a[]是一个缓冲 k:当前考虑的位置 
{
	if(n == 0)
	{
		//if(sort_order(a, k - 1))
		//{
			for(int i = 0; i < k-1; i++)//i <= k - 1 //k是经过 加1 后传进来的 
			{
				cout << a[i] << "+" ;
			}
			cout << a[k-1] ;
			
			cout << endl;
		//}
	}
//	if(n == 0)
//	{
//		cout << endl;
//	}
	for(int i = n; i > 0; i--)
	{
		if(k > 0 && i > a[k-1]) continue;
		a[k] = i;
		split_int(n - i, a, k + 1);
	}
}

//err_sum :有错的和  
// a[]:明细  
// num:明细的数目 
//k:当前处理的位置 
//cur_sum:前边的元素的累加和 
//b[] :表示a的对应项是否选取 
void account(int err_sum, int a[], int num, int k, int cur_sum, int b[])//根据需要灵活大方的添加参数 
{
	if(cur_sum > err_sum) return;
	
	if(err_sum == cur_sum)
	{
		for(int i = 0;i <= num; i++)
		{
			if(b[i] == 1)
				cout << a[i] << " ";
		}
		cout << endl;
		return;
	}
	
	if(k >= num) return;
	//此处出口的3个判断条件的顺序很关键 
	
	b[k] = 1;
	account(err_sum, a, num, k + 1, cur_sum, b);
	
	b[k] = 0;
	cur_sum = cur_sum + a[k];
	account(err_sum, a, num, k + 1, cur_sum, b);
	b[k] = 1;//此处回溯特别关键 
}

int main()
{
	cout << "----------begin--------------------------------------------------" << endl;
/**
	构建递归的要诀:
	1.找到相似性 
	2.定义出口 
**/

	/** 反转串 **/
	// 我们把 "cba" 称为 "abc" 的 反转串
	cout << reverseString("abcd") << endl; 
	cout << "--------------------" << endl;

	/** 杨辉三角形 **/ //(a+b)的n次幂的展开式中各项的系数很有规律  n = 2, 3, 4的时候分别是
	//1 2 1, 1 3 3 1, 1 4 6 4 1. 
	/*			
					1
				1		1
			1		2		1
		1		3		3		1
	1		4		6		4		1
1		5		10		10		5		1
	*/
	//cout << yanghuiAngle(5,2) << endl;//计算第m行第n个系数 从0算起 

	yanghuiAngle_out(6);
	cout << "--------------------" << endl;

	/** 计算m个A n个B 可以组成多少种不同的全排列 **/
	cout << ab(3,1) << endl;
	cout << "--------------------" << endl;

	/** 整数的划分 **/
	// n = 6
	//5 1
	//4 2, 4 1 1
	//3 3, 3 2 1, 3 1 1
	//2 2 2, 2 2 1 1, 2 1 1 1 1
	//1 1 1 1 1 1
	int a[1000]; 
	split_int( 6, a, 0);
	cout << "--------------------" << endl;
	
	/** 财务部门报账错误问题 **/
	//6
	//5
	//3
	//2
	//4
	//3
	//1
	//
	//1 3 3
	//1 2 4 
	//3 4
	//
	int a_a[5] = {3,2,4,3,1};
	int a_b[5];//表示a的对应项是否选取 
	account(6, a_a, 5, 0, 0,a_b);
	
	cout << "----------end--------------------------------------------------" << endl;
	return 0;
}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值