用函数递归求1!+2!+3!……+n! 的值的小问题

来源:百度知道 编辑:UC知道 时间:2024/05/05 02:34:13
这个函数要求的是 1!+2!+3!+……+n!的值,要求用函数递归来做。。。。。

疑惑在最下面的lj(int i)函数那里,不知道错在哪了。。。。

源代码如下:

#include<iostream>
using namespace std;

long lj(int i); // lj(int i),累加函数
long lc(int j); //lc(int j),累乘函数

int main()
{
int n;

do
{
cout<<"请输入需要阶乘累加的n值(n=0是退出):";

cin>>n;

if(n==0) break;

lj(n);

cout<<n<<"1!+2!+.....+n!的值是:"<<lj(n)<<endl;

}while(n!=0);

return 0;
}

long lj(int i)
{
int sum1=0;

if(i==0) sum1=0; //为什么当i==0后,sum1被赋值为1,而底下的return sum1不会返回1.

else

sum1=lj(i-1)+lc(i);

return sum1;

}

long lc(int j)
{
in

举一个例子,这样比较好理解:
1.如果n=5时,则有long li(5);这个函数,它执行了sum1=lj(4)+lc(5);
2.我们看到lc(5);这个函数的调用是不可能出错的,那么错误就只能在lj(4)上了
3.事实确实如此,lj(4)执行完后并不能返回值;因为你把条件改成i == 0时才有值返回
4.所以,总结的说,由于li(n-1)不能给准确的值给li(n)所以才有问题

至于为什么结果是lc(5),这是由于没有返回值时,sum1=lj(n-1)+lc(n);中li(n-1)被当做0处理了

先看累乘函数,其递归式子如下:
lc(j)=j*lc(j-1), j>1
lc(j)=1, j==1

所以函数应该这样写:
long lc(int j)
{
if(j==1) return(1);
else return (lc(j-1)*j);
}

再看累加函数,递归式子如下:
lj(i)=lj(i-1)+lc(i), i>0
lj(i)=0, i==0

所以函数应该这样写:
long lj(int i)
{
if(i==0) return(0);
else return(lj(i-1)+lc(i));
}

所以修改后的程序如下:

#include<iostream>
using namespace std;

long lj(int i);
long lc(int j);

int main()
{
int n;

do
{
cout<<"请输入需要阶乘累加的n值(n=0是退出):";
cin>>n;
if(n==0) break;
cout<<"1!+2!+..