关于递归的一道题目,对于递归我一直很困惑,请高手指点

nicky2002 2002-07-30 06:09:11
这是一道程序员考试的题目,这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 指向能成为和数的整数的存放位置。

[程序5]

#include〈stdio.h〉

#define N 20

int find( int n ,int m ,int *d ,int c ,int *pd )

{ int r ;

if ( n == 0 ) return 0 ; /* 已分解完成 */

if ( n == 0 ) return -1 ; /* 不可以分解 */

if ( __(1)__ ) return find( n ,m , d+1 ,c-1 ,pd ) ;

else { *pd = *d ;

r = find( __(2)__ ,d , c , __(3)__ ) ; /* 继续对剩余数作分解 */

if ( r >= 0 ) __(4)__ ;

return find( n ,m , __(5)__ ,pd ) ;

}

}

void main()

{ int n ,m ,k ,i ,p[N] ,*pptr = p ;

int d[ ] = { 100, 81, 64, 49, 36, 25, 16, 9, 4, 1 } ;

printf( "Enter n , m : " ; scanf( %d %d ,&n ,&m );

k = find( n , m , d , 10 , pptr ) ;

if ( k <= O ) printf ( "No answer!\n" ) ;

else{ printf( "%d = %d" , n , p[0] ) ;

for ( i = l ; i < k ; i++ )

printf(" +%d" , p[i] ) ;

printf("\n");

}
...全文
64 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoukun666 2002-07-31
  • 打赏
  • 举报
回复
to nicky2002 (nicky2002) 台兄:
能公布一下答案么?
我看了半天都摸不到头脑,你程序中的“R"如果在这要天的五空中没有的话
那就只能永远是0或者初始值了,那这与最后你像用它来控制“和数的整数“
的输出就肯定是行不通的!
powerbenny 2002-07-30
  • 打赏
  • 举报
回复
int find(int n,int m,int *d,int c,int *pd)
{
int r;
if(n==0) return 0;
if(m==0) return -1;
if(n<d[0]) return find(n,m,d+1,c-1,pd); //这里填n<d[0]
else
{
*pd=*d;
r=find(n-d[0],m-1,d,c,pd+1); //这里填n-d[0],m-1和pd+1
if(r>=0) return r+1; //这里填return r+1
return find(n,m,d+1,c-1,pd); //这里填d+1,c-1
}
}

这种题我是这样做的:第一个空,我看到后面d+1,c-1证明了数组往后移一位,所以就是第一个数没有用,也就是n<d[0].
第二个空看到*pd=*p;开始赋值给数组,证明数组第一个数有用,那么n就要减d[0],m要减1,同时pd要加一。这时,第三个空同时解决。
第四个空显然是判断是否有解。因为find返回的值为数组个数,如果n>=0,这肯定返回r+1。
第五个就是没有解,证明数组中第一个数不是解,所以就应该为d+1,c-1
DongnoD 2002-07-30
  • 打赏
  • 举报
回复
您的程式里有些地方不明了,这里我贴上自己的程式,供您参考。
----------------------------------------------------------
import java.io.*;

public class SumUp {
private static final int d[]={100 ,81 ,64 ,49 ,36 ,25 ,16 ,9 ,4 ,1};
private static int cases[][]={{100,2},{13,2},{14,2},{71,5}};
private static int used[];
private static boolean hasSolution;

public static void main(String args[]) {
for(int i=0;i<cases.length;i++){
used=new int[cases[i][1]];
hasSolution=false;
if(search(cases[i][0], cases[i][0], cases[i][1])==false)
System.out.println(cases[i][0]+" = No answer");
}
}

private static boolean search(int forOutput, int sum, int count){
if(sum<=0||count<=0){
if(sum==0&&count>=0){
System.out.print(copySum+" = ");
for(int i=0;i<used.length;i++)
if(used[i]!=0)
System.out.print(used[i]+" ");
System.out.println("");
return true;
}
return false;
}else
for(int i=0;i<d.length;i++){
used[used.length-count]=d[i];
if(search(forOutput, sum-d[i], count-1)==true)
hasSolution=true;
used[used.length-count]=0;
}
return hasSolution;
}
}
-----------------------------------------------------------
Output:
100 = 100
100 = 64 36
100 = 36 64
13 = 9 4
13 = 4 9
14 = No answer
71 = 64 4 1 1 1
71 = 64 1 4 1 1
71 = 64 1 1 4 1
71 = 64 1 1 1 4
71 = 49 16 4 1 1
71 = 49 16 1 4 1
71 = 49 16 1 1 4
71 = 49 9 9 4
71 = 49 9 4 9
71 = 49 4 16 1 1
71 = 49 4 9 9
71 = 49 4 1 16 1
71 = 49 4 1 1 16
71 = 49 1 16 4 1
71 = 49 1 16 1 4
71 = 49 1 4 16 1
71 = 49 1 4 1 16
71 = 49 1 1 16 4
71 = 49 1 1 4 16
71 = 36 25 9 1
71 = 36 25 1 9
71 = 36 16 9 9 1
71 = 36 16 9 1 9
71 = 36 16 1 9 9
71 = 36 9 25 1
71 = 36 9 16 9 1
71 = 36 9 16 1 9
71 = 36 9 9 16 1
71 = 36 9 9 1 16
71 = 36 9 1 25
71 = 36 9 1 16 9
71 = 36 9 1 9 16
71 = 36 1 25 9
71 = 36 1 16 9 9
71 = 36 1 9 25
71 = 36 1 9 16 9
71 = 36 1 9 9 16
71 = 25 36 9 1
71 = 25 36 1 9
71 = 25 25 16 4
71 = 25 25 16 1
71 = 25 25 4 16
71 = 25 25 4 1 1
71 = 25 25 1 16
71 = 25 25 1 4 1
71 = 25 16 25 4
71 = 25 16 25 1
71 = 25 16 4 25
71 = 25 16 4 1 2
71 = 25 16 1 25
71 = 25 16 1 4 2
71 = 25 9 36 1
71 = 25 9 1 36
71 = 25 4 25 16
71 = 25 4 25 1 1
71 = 25 4 16 25
71 = 25 4 16 1 2
71 = 25 4 1 25 1
71 = 25 4 1 16 2
71 = 25 1 36 9
71 = 25 1 25 16
71 = 25 1 25 4 1
71 = 25 1 16 25
71 = 25 1 16 4 2
71 = 25 1 9 36
71 = 25 1 4 25 1
71 = 25 1 4 16 2
71 = 16 49 4 1 1
71 = 16 49 1 4 1
71 = 16 49 1 1 4
71 = 16 36 9 9 1
71 = 16 36 9 1 9
71 = 16 36 1 9 9
71 = 16 25 25 4
71 = 16 25 25 1
71 = 16 25 4 25
71 = 16 25 4 1 2
71 = 16 25 1 25
71 = 16 25 1 4 2
71 = 16 9 36 9 1
71 = 16 9 36 1 9
71 = 16 9 9 36 1
71 = 16 9 9 1 36
71 = 16 9 1 36 9
71 = 16 9 1 9 36
71 = 16 4 49 1 1
71 = 16 4 25 25
71 = 16 4 25 1 2
71 = 16 4 1 49 1
71 = 16 4 1 25 2
71 = 16 4 1 1 49
71 = 16 1 49 4 1
71 = 16 1 49 1 4
71 = 16 1 36 9 9
71 = 16 1 25 25
71 = 16 1 25 4 2
71 = 16 1 9 36 9
71 = 16 1 9 9 36
71 = 16 1 4 49 1
71 = 16 1 4 25 2
71 = 16 1 4 1 49
71 = 16 1 1 49 4
71 = 16 1 1 4 49
71 = 9 49 9 4
71 = 9 49 4 9
71 = 9 36 25 1
71 = 9 36 16 9 1
71 = 9 36 16 1 9
71 = 9 36 9 16 1
71 = 9 36 9 1 16
71 = 9 36 1 25
71 = 9 36 1 16 9
71 = 9 36 1 9 16
71 = 9 25 36 1
71 = 9 25 1 36
71 = 9 16 36 9 1
71 = 9 16 36 1 9
71 = 9 16 9 36 1
71 = 9 16 9 1 36
71 = 9 16 1 36 9
71 = 9 16 1 9 36
71 = 9 9 49 4
71 = 9 9 36 16 1
71 = 9 9 36 1 16
71 = 9 9 16 36 1
71 = 9 9 16 1 36
71 = 9 9 4 49
71 = 9 9 1 36 16
71 = 9 9 1 16 36
71 = 9 4 49 9
71 = 9 4 9 49
71 = 9 1 36 25
71 = 9 1 36 16 9
71 = 9 1 36 9 16
71 = 9 1 25 36
71 = 9 1 16 36 9
71 = 9 1 16 9 36
71 = 9 1 9 36 16
71 = 9 1 9 16 36
71 = 4 64 1 1 1
71 = 4 49 16 1 1
71 = 4 49 9 9
71 = 4 49 1 16 1
71 = 4 49 1 1 16
71 = 4 25 25 16
71 = 4 25 25 1 1
71 = 4 25 16 25
71 = 4 25 16 1 2
71 = 4 25 1 25 1
71 = 4 25 1 16 2
71 = 4 16 49 1 1
71 = 4 16 25 25
71 = 4 16 25 1 2
71 = 4 16 1 49 1
71 = 4 16 1 25 2
71 = 4 16 1 1 49
71 = 4 9 49 9
71 = 4 9 9 49
71 = 4 1 64 1 1
71 = 4 1 49 16 1
71 = 4 1 49 1 16
71 = 4 1 25 25 1
71 = 4 1 25 16 2
71 = 4 1 16 49 1
71 = 4 1 16 25 2
71 = 4 1 16 1 49
71 = 4 1 1 64 1
71 = 4 1 1 49 16
71 = 4 1 1 16 49
71 = 4 1 1 1 64
71 = 1 64 4 1 1
71 = 1 64 1 4 1
71 = 1 64 1 1 4
71 = 1 49 16 4 1
71 = 1 49 16 1 4
71 = 1 49 4 16 1
71 = 1 49 4 1 16
71 = 1 49 1 16 4
71 = 1 49 1 4 16
71 = 1 36 25 9
71 = 1 36 16 9 9
71 = 1 36 9 25
71 = 1 36 9 16 9
71 = 1 36 9 9 16
71 = 1 25 36 9
71 = 1 25 25 16
71 = 1 25 25 4 1
71 = 1 25 16 25
71 = 1 25 16 4 2
71 = 1 25 9 36
71 = 1 25 4 25 1
71 = 1 25 4 16 2
71 = 1 16 49 4 1
71 = 1 16 49 1 4
71 = 1 16 36 9 9
71 = 1 16 25 25
71 = 1 16 25 4 2
71 = 1 16 9 36 9
71 = 1 16 9 9 36
71 = 1 16 4 49 1
71 = 1 16 4 25 2
71 = 1 16 4 1 49
71 = 1 16 1 49 4
71 = 1 16 1 4 49
71 = 1 9 36 25
71 = 1 9 36 16 9
71 = 1 9 36 9 16
71 = 1 9 25 36
71 = 1 9 16 36 9
71 = 1 9 16 9 36
71 = 1 9 9 36 16
71 = 1 9 9 16 36
71 = 1 4 64 1 1
71 = 1 4 49 16 1
71 = 1 4 49 1 16
71 = 1 4 25 25 1
71 = 1 4 25 16 2
71 = 1 4 16 49 1
71 = 1 4 16 25 2
71 = 1 4 16 1 49
71 = 1 4 1 64 1
71 = 1 4 1 49 16
71 = 1 4 1 16 49
71 = 1 4 1 1 64
71 = 1 1 64 4 1
71 = 1 1 64 1 4
71 = 1 1 49 16 4
71 = 1 1 49 4 16
71 = 1 1 16 49 4
71 = 1 1 16 4 49
71 = 1 1 4 64 1
71 = 1 1 4 49 16
71 = 1 1 4 16 49
71 = 1 1 4 1 64
71 = 1 1 1 64 4
71 = 1 1 1 4 64
zf0579 2002-07-30
  • 打赏
  • 举报
回复
should be
if (m == 0) return -1;

(1) n < *d
(2) n - *d, m - 1
(3) pd+1
(4) return (r+1)
(5) d, c

不知道 对否? 呵呵
zf0579 2002-07-30
  • 打赏
  • 举报
回复

if ( n == 0 ) return 0 ; /* 已分解完成 */

if ( n == 0 ) return -1 ; /* 不可以分解 */

怎么都是 n == 0 是不是有个n < 0?

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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