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__;
}