递归算法7——复杂递归之和式分解

和式分解

给定一个正整数n,输出和为n的所有不增的正整数和式。

【问题】

要求给定一个正整数n,输出和为n的左右不增的正整数和式。例如,n=5,则输出的和式结果为:

5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

【分析】
这是2009年人民银行笔试题目,引入数组a,用来存放分解出来的和数,其中,a[k]存放第k分解出来的和数。递归函数应设置:第1个参数是数组名a,用来将数组中的元素传递给被调用函数;第2个参数i表示本次递归调用要分解出来的数;第3个参数k是本次递归调用将要分解出来的第k给和数。递归函数原型为:

void rd(int a[], int i, int k)

对将要分解的数i,可分解出来的数j共有i种可能选择,它们是i,i-1,...,2,1。但为了保证分解出来的和数依次构成不增的正整数数列,要求从i分解出来的和数j不超过a[k-1],即上次分解出来的和数。

特别是,为保证对第一步(k=1)分解成立,程序可在a[0]预置n,即第一个和数最大为n。在分解过程中,当分解出来的数j==i时,说明已经完成一个和式分解,应将和数输出;当分解出来的数j<i时,说明还有i-j行第k+1次分解。

code:

#include<stdio.h>
#include <iostream>
#define N 50
void rd(int a[], int i, int k);
void main()
{
	int n, a[N];
	printf("请输入一个正整数n(0<=n<50):");
	scanf("%d", &n);
	a[0] = n;
	printf("和式分解结果:\n");
	rd(a, n, 1);
	system("pause");
}
void rd(int a[], int i, int k)
{
	int j, p;
	for (j = i; j >= 1; j--)
	{
		if (j <= a[k - 1])
		{
			a[k] = j;
			if (j == i)
			{
				printf("%d=%d", a[0], a[1]);
				for (p = 2; p <= k; p++)
					printf("+%d", a[p]);
				printf("\n");
			}
			else
				rd(a, i - j, k + 1);
		}
	}
}

结果:

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/104143415