版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83417397
- 字符串反转
// 反转串
// 例如:abc -> cba
#include <stdio.h>
#include <string.h>
void ReverseString(char *p)
{
int length = strlen(p);
if(length <= 1)
{
return;
}
else
{
char tmp = p[0];
p[0] = p[length-1];
p[length-1] = '\0';
ReverseString(p+1);
p[length-1] = tmp;
}
}
int main()
{
char p[] = "abcd";
ReverseString(p);
printf("%s\n", p);
return 0;
}
- 组合问题
// 组合问题
// 3个A 2个B可以组成多少 种 排列
// 如:AAABB AABBA等
#include <stdio.h>
// m个A n个B
int f(int m, int n)
{
if(m == 0 || n == 0)
{
return 1;
}
// 假设首位置为A,则剩下m-1个A和n个B的组合问题 + 首位置为B...
return f(m-1, n) + f(m, n-1);
}
int main()
{
printf("%d\n", f(3, 1));
return 0;
}
- 杨辉三角
// 杨辉三角
// 计算第m层第n个元素
/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
*/
#include <stdio.h>
int f(int m, int n)
{
if(n == 0)
{
return 1;
}
if(m == n)
{
return 1;
}
return f(m-1, n) + f(m-1, n-1);
}
int main()
{
int leval = 5; // 第5行 0-5共6个元素
for(int i=0; i<=leval; i++)
{
printf("%d ", f(leval, i));
}
printf("\n");
return 0;
}
- 整数划分问题
// 整数划分问题
// n = 6
/*
6
5+1
4+2,4+1+1
3+3,3+2+1,3+1+1+1
2+2+2,2+2+1+1,2+1+1+1+1
1+1+1+1+1+1
*/
#include <stdio.h>
#define MAXSIZE 1024
// arr->缓冲,cur->当前位置
void f(int n, int arr[], int cur)
{
if(n<=0)
{
for(int i=0; i<cur; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return;
}
for(int i=n; i>0; i--)
{
if(cur>0 && i>arr[cur-1])
{
continue;
}
arr[cur] = i;
f(n-i, arr, cur+1);
}
}
int main()
{
int arr[MAXSIZE] = {0};
f(6, arr, 0);
return 0;
}