user-0 提问: 求指导这个问题应该用什么思想去做

回复:
user: user-1
content: 这里不是求分拆的结果，只是求分拆的计数 应该有公式吧

user: user-1
content: 至少可以递推

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> void print(int res[], int num) {     static int L=0;     L++;     printf("%8d:",L);     for (int i=0;i<num;++i) {         printf(" %d", res[i]);     }     printf("\n"); } void split(int n, int m) {// n表示总数，m表示最大因子     static int res[100];// 保存结果     static int num=-1;// 当前因子下标      if (n<m || n<0 || m<1) return;     num++;     if (0==n) {// 递归终止条件，为0不可再分，直接输出         print(res,num+1);         num--;         return;     } else {         if (n==m) {// 不拆，直接输出             res[num]=m;             print(res,num+1);             num--;         } else {             // 拆分出第一个             res[num]=m;             n=n-m;              if (m>n) m = n; // 最大因子不可能大于总数              for (int i=m;i>=1;--i) {// 循环，第二个因子可以继续拆分，而且按照最大因子不同可以拆分成多个                 split(n,i);             }             num--;         }     } } void Split(int n) {     if (n<=0) return;     if (100<n) {         printf("Up to 100\n");         return;     }     for (int i=n;i>=1;--i) {         split(n, i);     } } void main(int argc,char **argv) {          if (argc<=1) Split(5);     else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));     else              Split(atoi(argv[1])); }

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-3
content: 可以用递归  #include<stdio.h>   int stack[100];   int top;   int total,n;   void dfs(int index)   {     int i;     if(total==n)     {         printf("%d=",n);         for(i=0;i<top-1;i++)             printf("%d+",stack[i]);         printf("%d\n",stack[top-1]);     }     if(total>n )         return ;     for(i=index;i>=1;i--)     {         total+=i;         stack[top++]=i;         dfs(i);         total-=i;         stack[--top];     }   }   void main()   {       while(scanf("%d",&n)!=EOF)       {           top=0;           total=0;           dfs(n-1);       }   }

user: user-2
content: 那学校老师跟本ID比，不是侮辱本ID吗？

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <stdarg.h> int stack[1000]; int top; int total,n; int nnnnn = 0; #define push(e) do { total += e;  stack[top++]=e; }while(0) #define pop(e) do { total -= e; top--; }while(0)  void dfsA( int m, int s ) {   int i;   if(total>n )       return ;   if ( m < 0 || s <0 )   {       return ;   }   push(s);   push(m);    if ( n == 1 )   {       printf("1\n");       nnnnn = 1;       return;   }    if ( stack[1] != n )    {      printf("%d=",n);    for(i=0;i<top-1;i++)    if ( stack[i] != 0 )         printf("%d+",stack[i]);     if ( stack[top-1] != 0 )         printf("%d\n",stack[top-1]);      nnnnn++;     }       pop(m);     //pop(s);     //push(s);    for(i=1;i<m;i++)   {       dfsA( m - i, i );   }   pop(s); }  void main() {   int i;     while(scanf("%d",&n)!=EOF)     {         top=0;         total=0;         nnnnn = 0;        // for ( i=1; i<n; i++ )         dfsA(n-0, 0);          printf("total:%d\n", nnnnn );     } }

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  代码有参考价值，这段话才更有价值。谢谢，感觉比学校的老师靠谱啊。。

user: user-0
content: 对啊。我是开始想到了递归。。可是我推着推着就蒙了。。