整数划分(递归方法)

最近讲到了递归,老师布置了一道经典的整数划分问题,浏览了网上很多代码,还是似懂非懂,想找张清晰地展现递归过程的图片也没有,今天想了想,自己画了一张才发现,想完整清晰地表现这个过程确实真的很难,情况太多,一层一层递归,每层还有循环。因此我也只是画了一点点,不过总体思路大致是一样的。本人水平有限,图也相当粗糙,放上来希望有所帮助,如有错误,欢迎指正。

题目:将一个整数划分为多个整数想加的形式,并输出有所划分方法。
例: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
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为例)
整数划分(递归方法)_第1张图片
运行截图:
整数划分(递归方法)_第2张图片

你可能感兴趣的:(C语言,算法,递归,算法,C语言,整数划分,递归图解)