构建递归的要诀:
1.找到相似性
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;
}