程序员考题,递归问题,高手请进

zhaomaster 2003-08-22 05:46:23
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序5说明]
本程序采用递归算法将一个自然数 n 分解成不多于 m 个整数之和。设构成和数 n 的各个整数取于数组 d ,d

中的整数互不相等且由大到小存储。
例如,数组 d 中存储以下整数: d[] = {100 ,81 ,64 ,49 ,36 ,25 ,16 ,9 ,4 ,1} ,则有:
n m 程序运行后的输出
100 2 100 = 100
13 2 13 = 9 + 4
14 2 No answer (9+4+1超过2个)
71 5 71 = 49 + 9 + 9 + 4 (表示可重复取数)
 
函数find()的形参 c 表示 d 中可取的整数个数;形参 pd 指向能成为和数的整数的存放位置。

#include <stdio.h>
#define N 20
int find( int n ,int m ,int *d ,int c ,int *pd )
{ int r=0 ;
if ( n == 0 ) return 0 ; /* 已分解完成 */
if ( n == 0 ) return -1 ; /* 不可以分解 */
printf("n=%d,m=%d,d=%d,c=%d,pd=%d\n",n,m,*d,c,*pd);
if ( *d>n && m>0 && c>0 ) return find( n ,m , d+1 ,c-1 ,pd ) ;


else { *pd = *d ;
printf("pd=%d\n",*pd);
r = find( n-*d,m--,d , c , ++pd ) ; /* 继续对剩余数作分解 */
if ( r >= 0 ) return r+1 ;
printf("r=%d\n",r);
return find( n ,m ,d+1,c-1 ,pd ) ;//这一句的递归怎么理解????
}
}
void main()
{ int n=71 ,m=5,k=0 ,i=0 ,p[N] ,*pptr=p;
int d[ ] = { 100, 81, 64, 49, 36, 25, 16, 9, 4, 1 } ;
for (i=0;i<N;i++)
p[i]=0;
k = find(n,m,d,10,pptr ) ;
if ( k <=0) printf ( "No answer!\n" ) ;
else printf( "%d = %d" , n , p[0] ) ;
for ( i =1 ; i < k ; i++ )
printf(" +%d" , p[i] ) ;
printf("\n");
getchar();

}

上面的程序在c++builder运行成功,但有逻辑错误
运行结果如下
n=71,m=5,d=100,c=10,pd=0
n=71,m=5,d=81,c=9,pd=0
n=71,m=5,d=64,c=8,pd=0
pd=64
n=7,m=5,d=64,c=8,pd=0
n=7,m=5,d=49,c=7,pd=0
n=7,m=5,d=36,c=6,pd=0
n=7,m=5,d=25,c=5,pd=0
n=7,m=5,d=16,c=4,pd=0
n=7,m=5,d=9,c=3,pd=0
n=7,m=5,d=4,c=2,pd=0
pd=4
n=3,m=5,d=4,c=2,pd=0
n=3,m=5,d=1,c=1,pd=0
pd=1
n=2,m=5,d=1,c=1,pd=0
pd=1
n=1,m=5,d=1,c=1,pd=0
pd=1
71 = 64 +4 +1 +1 +1

想一下不对,正确的应该是
71 = 49 + 9 + 9 + 4
请问高手
return find( n ,m ,d+1,c-1 ,pd ) ;//这一句的递归怎么理解????
为什么m没有递减
return find( n ,m ,d+1,c-1 ,pd ) 这句也没有执行
当71分解到64+4+1+1+1时,正确的情况下,怎么把64的值排除,并取49这个值,
应该通过m的值吧,具体怎么修改呢?
请具体说明该步骤,谢谢了

...全文
77 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangsm 2003-08-22
  • 打赏
  • 举报
回复
1)我想你的答案是对的
2)r = find( n-*d,m--,d , c , ++pd ) ; /* 继续对剩余数作分解 */---》应该是:
r = find( n-*d,--m,d , c , ++pd ) ; /* 继续对剩余数作分解 */
3)return find( n ,m ,d+1,c-1 ,pd ) ;//这一句的递归怎么理解????--》作用:相当于 回溯,如果71分成64+。。。。不行得话,就要重新从49开始分一遍。但是如果找到了就没有做这一步,所以只找了一种情况。

qhgary 2003-08-22
  • 打赏
  • 举报
回复
up
zhaomaster 2003-08-22
  • 打赏
  • 举报
回复
自己先up,快来呀

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧