和式分解--递归设计
Csdn上的一个问题程序运行: 输入n,输出其和等于n的所有不增的正整数和式。例如,n=4,程序将输出: 4=4; 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 但如果用递归方法 算法: 递归函数设置两个参数:参数i是本次递归调用要分解的数,参数
·
Csdn上的一个问题
程序运行:
输入n,输出其和等于n的所有不增的正整数和式。例如,n=4,程序将输出:
4=4;
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
但如果用递归方法
算法:
递归函数设置两个参数:参数i是本次递归调用要分解的数,参数k是本次递归调用将分
解出第k个和数。
解出第k个和数。
1) 对要分解的数i,可分解出来的数j共有i种可能选择,它们分别是:i,i-1,...,2,1。 但是为了保证分解出来的和数依次构成不增的正整数数列,则要求从i分解出来的和数j不能超过a[k-1]。为了保证上述要求对第一步(k=1)分解也成立,程序可以在a[0]中预置n,即第一个和数最大为n。
2) 在分解过程中,当分解出来的数j=i时,说明已完成一个完整的和式分解,应该将和式输出;当分解出来的数j<i时,说明还有i-j需要分解,并且分解出第k+1个以及之后的和数。
#include<stdio.h>
#undef N
#define N 5
void rd(int i,int *b, int k)...{
int j = 0;
int t = 0;
for(j=i;j>=1;j--) 
if(j<=b[k-1])...{
b[k]=j;
if(j==i) 
...{
printf("%d=%d",N, b[1]);
for(t=2;t<=k;t++)
printf("+%d", b[t]);
printf(" ");
}
else
rd(i-j, b, k+1); //继续分解的数是i-j,分解出第k+1个和数
}
}
int main(int argc, char* argv[]) 
...{
int b[N+1];
b[0]=N;
rd(N, b, 1);
return 0;
}
更多推荐

所有评论(0)