#include <stdioh>
float E(int M, float x);
float Fact(int M, float x);
float Fact1(int M);
int main()
{
float e, x;
int M;
scanf("%d %f", &M, &x);
e = E(M, x);
printf("%f", e);
return 0;
}
float E(int M, float x)
{
if (M == 1) return x + 1;
else return (Fact(M, x) / Fact1(M)) + E(M - 1, x);
}
float Fact(int M, float x)
{
if (M == 1) return x;
else return xFact(M - 1, x);
}
float Fact1(int M)
{
if (M == 1) return 1;
else return MFact1(M - 1);
}
我这里用了三个函数,第一个是计算E^x的,第二个是计算x^n的,第三个是计算n!的,三个都用了递归的方法,你可以尽情地感受下,什么是递归思想
递归的原理解释:
递归,是函数实现的一个很重要的环节,很多程序中都或多或少的使用了递归函数。递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。
递归之所以能实现,是因为函数的每个执行过程都在栈中有自己的形参和局部变量的拷贝,这些拷贝和函数的其他执行过程毫不相干。这种机制是当代大多数程序设计语言实现子程序结构的基础,是使得递归成为可能。假定某个调用函数调用了一个被调用函数,再假定被调用函数又反过来调用了调用函数。这第二个调用就被称为调用函数的递归,因为它发生在调用函数的当前执行过程运行完毕之前。而且,因为这个原先的调用函数、现在的被调用函数在栈中较低的位置有它独立的一组参数和自变量,原先的参数和变量将不受影响,所以递归能正常工作。程序遍历执行这些函数的过程就被称为递归下降。
程序员需保证递归函数不会随意改变静态变量和全局变量的值,以避免在递归下降过程中的上层函数出错。程序员还必须确保有一个终止条件来结束递归下降过程,并且返回到顶层。
您的程序中有个笔误,即void hanoi(int n,char one,char,two,char three)中char,two中间的逗号应去掉换成空格。
这个汉诺塔问题不好说清楚,关键是明白其中道理。
汉诺塔这是一个只有用递归方法才能够解决的问题。递归方法就是通过把问题不断转化为更简单的同样性质的问题而求得最终解决的方法。
从形式上,一个函数再调用它本身,这就是递归调用。即在调用一个函数的过程中又直接或间接地调用函数本身。无控制的递归都是无终止的自身调用,会导致死机。合理的递归程序设计应控制在某条件成立时进行递归,否则不再进行递归调用。通常在递归的调用过程中,不断改变递归的条件,以使递归条件到最后不再成立,这就能有结果。
递归程序设计的关键就是考虑问题的两种情况,一种是普遍情况即函数值等于把问题递推一步后的本函数的调用,一种是极端或端点情况,此时函数值有确定的一个值而无须再调用本函数。递归的过程就是从普遍情况逐步过渡到端点情况的过程。
就本题来说,若要将n个盘子从塔A移动到塔C,需用以下3个步骤:
(1)先设法把A上的n-1个盘子借助于C先移到B上;
(2)把A上的1个盘子(底部最大的盘子)移到C上;
(3)再设法把B上的n-1个盘子借助于A移到C上。
其中步骤(1)和(3)就是问题转化为更简单(n少了一个)的同样性质的(尽管起始位置和目标位置各异)递推一步后的问题。
这就是普遍情况。
它的极端或端点情况就是n=1即只有一个盘子时可以直接把盘子从A移到C上。
因此,如果函数hanoi(n,one,two,three)的功能是要把n个盘子从塔one移动到塔three,它的具体实现就是以下步骤:
if(n==1)
move(one,three);
else
{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
由于本题是要打出移动的步骤,故move(one,three)就是打出one-->three形式即可,变量one,two,three中根据情况存放塔号(字符'A','B','C'),即执行printf("%c-->%c\n",one,three)。
还可以把hanoi函数中的两处move(one,three);直接换成两句printf("%c-->%c\n",one,three);并省去后边的move函数,这样程序更精炼。即程序为:
#include <stdioh>
hanoi(n,one,two,three)
{
if(n==1)
printf("%c-->%c\n",one,three);
else
{hanoi(n-1,one,three,two);
printf("%c-->%c\n",one,three);
hanoi(n-1,two,one,three);
}
}
void main()
{
int m;
printf("Input the number of diskes:");
scanf("%d",&m);
printf("The step to moveing %d diskes:\n",m);
hanoi(m,'A','B','C');
}
/
运行结果:
Input the number of diskes:3
The step to moveing 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
/
我的数学很差, 不理解题目意思,
递归大概这么写,看看意思对么
int main(void)
{
int n=x;
Method(n);
}
int Method(&int _n)
{
if(n>1)
Method(_n)
else
n++;
}
递归算法的时间复杂度在算法中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解,常用以下四种方法:
1代入法(Substitution Method)代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。
2迭代法(Iteration Method)迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。
3套用公式法(Master Method)这个方法针对形如“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系。
即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。
4差分方程法(Difference Formula Method)可以将某些递归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。
扩展资料:
1递归是指对一个问题的求解,可以通过同一问题的更简单的形式的求解来表示,并通过问题的简单形式的解求出复杂形式的解,是解决一类问题的重要方法。
2递归程序设计是程序设计中常用的一种方法,它可以解决所有有递归属性的问题,并且是行之有效的
3但对于递归程序运行的效率比较低,无论是时间还是空间都比非递归程序更费,若在程序中消除递归调用,则其运行时间可大为节省
思路:递归求阶乘函数,如果输入的参数等于1则返回1,否则返回n乘以该函数下次递归。
参考代码:
#include
int fun(int n)
{
if(n==1||n==0) return 1;//如果参数是0或者1返回1
return nfun(n-1);//否则返回n和下次递归的积
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",fun(n));
return 0;
}
/
5
120
/
递归算法的原理
递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写
递归能使程序变得简洁和清晰。
以上就是关于c语言程序设计问题(递归)全部的内容,包括:c语言程序设计问题(递归)、递归的原理解释、c语言的问题~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)