1. 首页 > 科技

C语言递归练习?

C语言递归练习?

C语言递归编程题

看看是否符合你的要求:

#include<stdio.h>

#include<stdlib.h>

int quqiu(int *p,int x)

{

static int k=0;

if(x==2)

{

printf("最后两个球是:");

if(p[x-1]==1)

printf("白球、");

else

printf("黑球、");

if(p[x-2]==1)

printf("白球\n");

else

printf("黑球\n");

return ++k;

}

else

{

if(p[x-1]==p[x-2])

p[x-2]=1;

else

p[x-2]=2;

k++;x--;

quqiu(p,x); //递归调用

}

return k;

}

main()

{

int *p,m,n,k,i,x;

printf("请输入白球的个数:");

scanf("%d",&m);

printf("请输入黑球的个数:");

scanf("%d",&n);

p=(int *)malloc(m+n);//申请m+n个空间,1为白球,2为黑球

for(i=0;i<m+n;i++)

p[i]=0;

for(i=1;i<=m;i++)

{

x=rand()%(m+n); //产生随机位置

p[x]=1; //随机放入m个白球

}

for(i=0;i<m+n;i++)

if(!p[i])

p[i]=2; //其余n个空间放黑球

printf("\n");

k=quqiu(p,m+n);

printf("共有%d种取法!\n",k);

}

要一些C程序 递归的例题!

【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

斐波那契数列为:0、1、1、2、3、……,即:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

写成递归函数有:

int fib(int n)

{ if (n==0) return 0;

if (n==1) return 1;

if (n>1) return fib(n-1)+fib(n-2);

}

【问题】 组合问题

问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1

(4)5、3、2 (5)5、3、1 (6)5、2、1

(7)4、3、2 (8)4、3、1 (9)4、2、1

(10)3、2、1

【程序】

# include <stdio.h>

# define MAXN 100

int a[MAXN];

void comb(int m,int k)

{ int i,j;

for (i=m;i>=k;i--)

{ a[k]=i;

if (k>1)

comb(i-1,k-1);

else

{ for (j=a[0];j>0;j--)

printf(“%4d”,a[j]);

printf(“\n”);

}

}

}

void main()

{ a[0]=3;

comb(5,3);

}

【问题】 背包问题

问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

设n件物品的重量分别为w0、w1、…、wn-1,物品的价值分别为v0、v1、…、vn-1。采用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。当前正在考察新方案,其物品选择情况保存于数组cop[ ]。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。

对于第i件物品的选择考虑有两种可能:

(1) 考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。

(2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。

按以上思想写出递归算法如下:

try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv)

{

if(包含物品i是可以接受的)

{ 将物品i包含在当前方案中;

if (i<n-1)

try(i+1,tw+物品i的重量,tv);

else

以当前方案作为临时最佳方案保存;

恢复物品i不包含状态;

}

if (不包含物品i仅是可男考虑的)

if (i<n-1)

try(i+1,tw,tv-物品i的价值);

else

以当前方案作为临时最佳方案保存;

}

为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:

物品 0 1 2 3

重量 5 3 2 1

价值 4 4 3 1

并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。

按上述算法编写函数和程序如下:

【程序】

# include <stdio.h>

# define N 100

double limitW,totV,maxV;

int option[N],cop[N];

struct { double weight;

double value;

}a[N];

int n;

void find(int i,double tw,double tv)

{ int k;

if (tw+a.weight<=limitW)

{ cop=1;

if (i<n-1) find(i+1,tw+a.weight,tv);

else

{ for (k=0;k<n;k++)

option[k]=cop[k];

maxv=tv;

}

cop=0;

}

if (tv-a.value>maxV)

if (i<n-1) find(i+1,tw,tv-a.value);

else

{ for (k=0;k<n;k++)

option[k]=cop[k];

maxv=tv-a.value;

}

}

void main()

{ int k;

double w,v;

printf(“输入物品种数\n”);

scanf((“%d”,&n);

printf(“输入各物品的重量和价值\n”);

for (totv=0.0,k=0;k<n;k++)

{ scanf(“%1f%1f”,&w,&v);

a[k].weight=w;

a[k].value=v;

totV+=V;

}

printf(“输入限制重量\n”);

scanf(“%1f”,&limitV);

maxv=0.0;

for (k=0;k<n;k++) cop[k]=0;

find(0,0.0,totV);

for (k=0;k<n;k++)

if (option[k]) printf(“%4d”,k+1);

printf(“\n总价值为%.2f\n”,maxv);

}

【程序】

# include <stdio.h>

# define N 100

double limitW;

int cop[N];

struct ele { double weight;

double value;

} a[N];

int k,n;

struct { int flg;

double tw;

double tv;

}twv[N];

void next(int i,double tw,double tv)

{ twv.flg=1;

twv.tw=tw;

twv.tv=tv;

}

double find(struct ele *a,int n)

{ int i,k,f;

double maxv,tw,tv,totv;

maxv=0;

for (totv=0.0,k=0;k<n;k++)

totv+=a[k].value;

next(0,0.0,totv);

i=0;

While (i>=0)

{ f=twv.flg;

tw=twv.tw;

tv=twv.tv;

switch(f)

{ case 1: twv.flg++;

if (tw+a.weight<=limitW)

if (i<n-1)

{ next(i+1,tw+a.weight,tv);

i++;

}

else

{ maxv=tv;

for (k=0;k<n;k++)

cop[k]=twv[k].flg!=0;

}

break;

case 0: i--;

break;

default: twv.flg=0;

if (tv-a.value>maxv)

if (i<n-1)

{ next(i+1,tw,tv-a.value);

i++;

}

else

{ maxv=tv-a.value;

for (k=0;k<n;k++)

cop[k]=twv[k].flg!=0;

}

break;

}

}

return maxv;

}

void main()

{ double maxv;

printf(“输入物品种数\n”);

scanf((“%d”,&n);

printf(“输入限制重量\n”);

scanf(“%1f”,&limitW);

printf(“输入各物品的重量和价值\n”);

for (k=0;k<n;k++)

scanf(“%1f%1f”,&a[k].weight,&a[k].value);

maxv=find(a,n);

printf(“\n选中的物品为\n”);

for (k=0;k<n;k++)

if (option[k]) printf(“%4d”,k+1);

printf(“\n总价值为%.2f\n”,maxv);

}

c语言递归函数编程习题

楼主,首先我想说一下你题目可能不小心打错了,我猜应该是求

(x/1!)+(x*x*x/3!)+(5个x相乘/5!)+……+((2n-1)个X相乘/(2*n-1)!)

当N为某值时上式为多少吧!

我帮你编写的代码如下(很用心编写的哦):

#include "stdio.h"

#include "math.h"

int power(int n)

{

if(n!=0) return n*power(n-1);

else return 1;

}

float computer(float x,int n)

{

return pow(x,2*n-1)/power(2*n-1);

}

void main()

{

int n,i;

float x,sum;

printf("please input the value of x and n\n");

scanf("%f %d",&x,&n);

printf("x=%f,n=%d\n",x,n);

for(i=1;i<=n;i++) sum+=computer(x,i);

printf("(x/1!)+(x*x*x/3!)+(x*x*x*x*x/5!)+……+(x*x*x*……/(2*n-1)!)=%f\n",sum);

}

程序我在Turbo C 2.0 Turbo C++ 3.0 和 Microsoft Visual C++ 6.0运行都通过了. 保证没问题!

请参考一下吧,呵呵.

C语言 递归函数题

__int_Intvert(int a[ ],int n)

{

_a.lenth=n__;

if (n<2) return;

Invert (__a[]_ , _n__);

t=a[0];

a[0]=a[n-1];

__a[n-1]=t__;

}