最近讲到了递归,老师布置了一道经典的整数划分问题,浏览了网上很多代码,还是似懂非懂,想找张清晰地展现递归过程的图片也没有,今天想了想,自己画了一张才发现,想完整清晰地表现这个过程确实真的很难,情况太多,一层一层递归,每层还有循环。因此我也只是画了一点点,不过总体思路大致是一样的。本人水平有限,图也相当粗糙,放上来希望有所帮助,如有错误,欢迎指正。题目:将一个整数划分为多个整数想加的形式,并输出有所划分方法。
例:6的划分:
6=5+1
6=4+2
6=4+1+1
6=3+3
6=3+2+1
6=3+1+1+1
6=2+2+2
6=2+2+1+1
6=2+1+1+1+1
6=1+1+1+1+1+1
具体代码如下:
#include <stdio.h>
//记录分解情况
int mark[100];
int n;
void divide(int now, int k, int pre);
int main()
{
scanf("%d", &n);
divide(0, 0, n - 1);return 0;
}//now记录数组当前长度,k记录递归深度, pre记录前一个的值
void divide(int now, int k, int pre)
{int i;
//数组长度大于n就返回
if(now > n) return; if (now == n){printf("%d=", n);for(i = 0; i < k - 1; i++){printf("%d+", mark[i]);}printf("%d\n", mark[i]);} else {for(i = pre; i > 0; i--){if( i <= pre){mark[k] = i;now += i;divide(now, k + 1, i);now -= i;}}}
}
图:(这里以输入6为例)
运行截图: