用C语言编程:用递归的主方法求解递归式 f(n) = 1*1 + 2*2 + 3*3 +……+ n*n 输入数字n,输出结果 f(n)。

写一函数用递归方法求:1+1/2+1/3+1/4+1/5+1/6+1/7....+1/n。
晴楼主注意:真正的递归方法如下,以上回答均非递归
float run(int n){
return run(n-1)+(1/(double)n); }
scanf("%d",&n);
res = run(n);
printf("%f",res);
其他答案(共2个回答)
main(){ float sum=0,j=1.0; //j需要为浮点数 for (i=1;i&=100;i++) {sum+...
你试试这个看看我也没测试过要是错了就只能说声抱歉了,帮不上忙#inclue # includemain(){int m,k,i,for (m=1 m&1...
#includeint fun(int n){int i,sum=0;for(i=1;i&=n;i++)sum+=i;}void main...
long fac(n){if(n&1){return n*fac(n-1);}else return 1;}main(){……print...
答: travelpony的床型中,twin room-1 bed到底是给几个人住的啊
答: cisco网络技术是一个为CTO、IT技术经理、网络工程师、安全工程师、数据库工程师、网络管理员、系统工程师、开发工程师、项目管理人员等IT技术人员搭建的有关先...
答: 我想学网页制作、网络维护、电脑维护可有比较好的学习网站或者论坛推选一下?你好!网易学院
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415c语言求1+2+...+n的解决方法
字体:[ ] 类型:转载 时间:
本篇文章是对在c语言中求1+2+...+n的解决方法进行了详细的分析介绍,需要的朋友参考下
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n 除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。我们仍然围绕循环做文章。循环只是让相同的代码执行n遍而已,我们完全可以不用for和while达到这个效果。比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。我们可以将需要执行的代码放到构造函数里。如下代码正是基于这个思路: 代码如下:class Temp{private:&static int N;&static int Spublic:&Temp() {&& ++ N;&& Sum += N;&&& }&static void Reset() {&& N = 0;&& Sum = 0; }&static int GetSum() {&& return S&& }};int Temp::N = 0;&&& //静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。int Temp::Sum = 0;int solution1_Sum(int n){&Temp::Reset();&Temp *a = new Temp[n];&delete []a;&a = 0;&return Temp::GetSum();}我们同样也可以围绕递归做文章。既然不能判断是不是应该终止递归,我们不妨定义两个函数。一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。那现在的问题是如和把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。有了上述分析,我们再来看下面的代码: 代码如下:class A;A* Array[2];class A{public:&virtual int Sum (int n) { return 0; }};class B: public A{public:&virtual int Sum (int n) { return Array[!!n]-&Sum(n-1)+n; }};int solution2_Sum(int n){&A&Array[0] = &a;&Array[1] = &b;&int value = Array[1]-&Sum(n);&}这种方法是用虚函数来实现函数的选择。当n不为零时,执行函数B::Sum;当n为0时,执行A::Sum。我们也可以直接用函数指针数组,这样可能还更直接一些: 代码如下:typedef int (*fun)(int);int solution3_f1(int i) {&return 0;}int solution3_f2(int i){&fun f[2]={solution3_f1, solution3_f2}; &return i+f[!!i](i-1);}另外我们还可以让编译器帮我们来完成类似于递归的运算,比如如下代码: 代码如下:template &int n& struct solution4_Sum{&enum Value { N = solution4_Sum&n - 1&::N + n};};template && struct solution4_Sum&1&{&enum Value { N = 1};};solution4_Sum&100&::N就是1+2+...+100的结果。当编译器看到solution4_Sum&100&时,就是为模板类solution4_Sum以参数100生成该类型的代码。但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum&100&::N=solution4_Sum&99&::N+100。这个过程会递归一直到参数为1的类型,由于该类型已经显式定义,编译器无需生成,递归编译到此结束。由于这个过程是在编译过程中完成的,因此要求输入n必须是在编译期间就能确定,不能动态输入。这是该方法最大的缺点。而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不能太大。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 java递归方法 的文章

 

随机推荐