递归算法求解1!+2!+3!+...+n!

javafalcon 2008-10-31 10:33:23
用递归算法编写函数long fun(int n)以求解1!+2!+3!+...+n!,希望算法时间复杂度有较好的性能。
...全文
2460 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2008-11-01
  • 打赏
  • 举报
回复
UP
nk_ysg 2008-11-01
  • 打赏
  • 举报
回复
nk_ysg 2008-11-01
  • 打赏
  • 举报
回复
飞雪mm的代码,引用下希望高手别介意



/*来点递归的*/
int GetResult1(int a, int b)
{
return b > 0 ? GetResult1((a + 1) * b, b - 1) : a;
}


nk_ysg 2008-11-01
  • 打赏
  • 举报
回复
这个飞雪mm写了个很好的
javafalcon 2008-11-01
  • 打赏
  • 举报
回复
1,2,3,16楼效率不够好,要重复算n!
6,17楼不合题意,要用递归函数。因为这只是一道考递归的题目,所以用循环虽然是最好的,但不合题意。
其它各楼的回复就不说了。
感谢11楼,感谢飞雪的博文,在飞雪的博文启发下,我解出了这题。算法设计如下:
long f(int n, int m)
{
if( n == 1 && m == 1) return 1;
if( m == 1) return n*f(n-1,1);
return f(n,1) + f(n-1,m-1);
}
int main(void)
{
int n=12;
printf("1!+2!+...+12!=%ld",f(12,12));
}
music_xu 2008-11-01
  • 打赏
  • 举报
回复
要计算:1!+2!+3!+...+n!,
用嵌套递归肯定不是一个好办法,
定义一个数组sum[]
然后写一个算n!的函数,用fun()调用,也可以直接把函数嵌到fun()内部,用一个n次循环搞定最后结果
nsh_nsh 2008-11-01
  • 打赏
  • 举报
回复
main()
{
int i, s = 1, p = 1,n;
for( i=2; i<=n; i++)
{
p*=i;
s+=p;
}
changhairen 2008-11-01
  • 打赏
  • 举报
回复
想效率高就是用for循环,又快又方便
czbever 2008-11-01
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>


long Get(int i)
{
if (i <= 1)
{
return i;
}

return i * Get(i - 1);
}

long F(int n)
{
if (n <= 1)
{
return n;
}

return Get(n) + F(n - 1);
}

int main()
{
printf("%d", F(3));

getchar();

}
iamliadai 2008-11-01
  • 打赏
  • 举报
回复
#include<stdio.h>
int sum_factorial(int n,int k,int sub_sum)
{
int sum=0;
sub_sum*=k++;
if(k<=n+1)
{
sum=sum_factorial(n,k,sub_sum)+sub_sum;
}
return sum;
}
int main(void)
{
printf("%d\n",sum_factorial(5,1,1));//计算5的阶乘和。
getchar();
}
//153 success!
iamliadai 2008-11-01
  • 打赏
  • 举报
回复
int sum_factorial(int n,int k,int sub_sum)
{
int sum=0;
sub_sum*=k++;
if(k<=n)
{
sum=sum_factorial(n,k,sub_sum)+sub_sum;
}
return sum;
}
piaomiaoju 2008-10-31
  • 打赏
  • 举报
回复
把递归存在一个全局变量里就可以了
piaomiaoju 2008-10-31
  • 打赏
  • 举报
回复 1
include<stdio.h>

#define N 20
long int fact(long int n,long int sum[])
{
if(n==1) {
sum[0]=1;
return 1;
}
else {
return sum[n-1]=n*fact(n-1,sum);
};


}
void main()
{
static long int sum[N];
long int result=0;
fact(N,sum);
for(int i=0;i<N;i++)
{
result+=sum[i];

}
printf("%d",result);
}
Fighting Horse 2008-10-31
  • 打赏
  • 举报
回复
要效率高,就要减少重复计算

int f = 1;
int sum = 0;
for (int i = 1; i <= n; i++, f *= i)
sum += f;
pagen_hd 2008-10-31
  • 打赏
  • 举报
回复
把1到100的事先算好,存起来,用户要什么有什么,不用当场算
JIGSONG 2008-10-31
  • 打赏
  • 举报
回复
这种可能也只能这样了
jackzhhuang 2008-10-31
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <math.h>


long Get(int i)
{
if (i <= 1)
{
return i;
}

return i * Get(i - 1);
}

long F(int n)
{
if (n <= 1)
{
return n;
}

return Get(n) + F(n - 1);
}

int main()
{
printf("%d", F(3));

getchar();

}


这样好看点
wyswyg63 2008-10-31
  • 打赏
  • 举报
回复
#include <stdio.h>

unsigned long func1(unsigned long n)
{
if(n==1) return 1;
else return n*func1(n-1);

}

unsigned long func2(unsigned long n)
{
if(n==1) return 1;
else return func2(n-1)+n*func1(n-1);

}

int main(void)
{
unsigned long a, b;
scanf("%d", &a);
b = func2(a);
printf("%d\n", b);
getchar();
getchar();
}
jackzhhuang 2008-10-31
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>


long Get(int i)
{
if (i <= 1)
{
return i;
}

return i * Get(i - 1);
}

long F(int n)
{
if (n <= 1)
{
return n;
}

return Get(n) + F(n - 1);
}

int main()
{
printf("%d", F(3));

getchar();

}

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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