这程序该如何运用递归法进行编?
递推法,算出n可以拆分的数据个数。题目的意思是:
一个整数n n<=100)可以有多种分划,使其分划的一列整数之间和为n,例如:
输入n=6
输出:
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
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int min(int m,int n)
{
return m<n?m:n;
}
void split(int n,int nLast,int *a,int t)
/* n表示现在要拆分的数字;
nLast表示上一次拆出的数;这次拆出的数要小于或等于上次拆出的数
a为存放前面拆出的数的数组的指针,待到要拆的数为0时依次输出数组中的数值
t表示数组中已有元素的个数*/
{
int i;
if(n>0) /*如果要拆的数大于0*/
for(i=min(n,nLast);i>0;i--) /*从n本身开始拆分,同时保证这次拆分的数不大于上次*/
{
a[t]=i; /*拆分出i,把i加入数组a*/
split(n-i,i,a,t+1); /*继续拆分剩下的数*/
}
else /*如果要拆分的数为0,停止拆分,直接输出数组*/
{
for(i=0;i<t-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[t-1]);
}
}
void main()
{
int m;
int a[MAX+1];
a[0]=1;
printf("Please input n:");
scanf("%d",&m);
split(m,m,a,0);
}