69,369
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
int list[256];
void split(int n , int m = 0)
{
int i;
if(n == 0)
{
for(i = 0 ; i < m ; ++i)
printf("%d " ,list[i]);
printf("\n");
return ;
}
for(i = n ; i > 0 ; --i)
{
if(m == 0 || i <= list[m-1])
{
list[m] = i;
split(n-i , m+1);
}
}
}
int main()
{
int n;
while(~scanf("%d" , &n))
{
split(n);
}
return 0;
}
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;
if (e>s) e=s;
for (i=e;i>=b;i--) {
if ((i+b)*(i-b+1)/2<s) break;
o[d]=i;
if (s-i<=0) {
n++;
printf("%8ld:",n);
for (j=0;j<=d;j++) printf("%d ",o[j]);
printf("\n");
} else {
if (d+1<1000) combsum(b,i-1,s-i,d+1);
else {
printf("Error:Too deep.\n");
return;
}
}
}
}
int main() {
printf("Input Begin,End,Sum:");fflush(stdout);
scanf("%d,%d,%d",&Begin,&End,&Sum);
n=0L;
combsum(Begin,End,Sum,0);
printf("Total:%ld\n",n);
return 0;
}
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出