用C语言编写递归函数。对于给定的n,输出其和等于n的所有不增的和式

例如:n=4,输出结果如下。 4=4   4=3+1   4=2+2   4=2+1+1   4=1+1+1+1   不好意思,我没分了
求程序代码和详细解答
最新回答
不要忘記

2024-10-30 11:45:00

#include "stdio.h"

void main()

{

int n,ns;int i,j,k,m;

printf("请输入n的值");

scanf("%d",&ns);//将输入n的值存入变量ns

    n=ns;

printf("%d=%d\n",n,n);//输出n=n的情况  比如7=7

//核心思想n=(n-1)+1再把n-1看做n进行递归直到n=1

while(n)

{

m=n/2;//取n的一半

for(i=1;i<=m;i++)//对于任意整数都可以看做n/2种两个正整数的和

{

k=n-i;

printf("%d=%d+%d",ns,k,i);//输出n=a+b型

for(j=0;j<ns-n;j++)//ns可以看做n后面加ns-n个1

{

printf("+1");

}

printf("\n");//换行

}

n--;

}

scanf("%d",&k);//防止窗口马上关闭  输入任意数回车关闭

}

追问
我觉得输出结果应该为:
7=7
7=6+1
7=5+2
7=5+1+1
7=4+3
7=4+2+1
7=4+1+1+1
7=3+3+1
7=3+2+1+1
7=3+1+1+1+1
7=2+2+2+1
7=2+2+1+1+1
7=2+1+1+1+1+1
7=1+1+1+1+1+1+1

能不能再修改下代码,我给你最佳.
追答
不好意思 原来我少考虑了一些情况  参考楼上的算法
#include "stdafx.h"
#include
int a[100] ; int y;int N;
void outresult(int k)
{
int j;
printf("%d=%d",N,a[0]);
for(j=1;j=1 ;j--)
if (k==0||j<=a[k-1])
{
a[k]=j;
rd(i-j,k+1) ;
}
}

int _tmain(int argc, _TCHAR* argv[])
{

printf("请输入N");
scanf("%d",&N);
rd(N,0);

scanf("%d",&y);

return 0;
}
想后不需要理由

2024-10-30 11:23:06

#include <stdio.h>
#define N 4
int a[100] ;
void outresult(int k)
{
int j;
printf("%d=%d",N,a[0]);
for(j=1;j<k;j++) printf("+%d",a[j]);
printf("\r\n");
}

void rd(int i ,int k)//递归法
{ if(i==0) outresult(k);
int j ;
for(j=i;j>=1 ;j--)
if (k==0||j<=a[k-1])
{
a[k]=j;
rd(i-j,k+1) ;
}
}
void main()
{
rd(N,0);
}

原理大概是这样的
a这个数组中存放着被分解的这些数
递归的过程就是用k表示已分解几个数,i表示原来的数减去已分解的数,可以看成待分解的部分。
注意这个循环
for(j=i;j>=1 ;j--)
if (k==0||j<=a[k-1])

每次从大到小分解这个数,这样能保证按字典序输出并且没有重复。
这个过程比较类似于深度优先搜索,就是dfs,不过是模拟的算法。
如果你还不明白我建议你看一些搜索算法的资料,这样比较好理解。