yingg 发表于 2016-11-5 22:29:48

各位咱们讨论一下递归吧!

#include"stdio.h"
#include"iostream"
using namespace std;
#definen 4
long factorial(longx)
{               
        if (x == 0) return 1;      //结束递归
        else return x*factorial(x - 1) ;
}
int main()
{
        long a;
        a=factorial(n);
        cout << n<<"的阶乘为"<<a<<endl;
}
/*
int _tmain(int argc, _TCHAR* argv[])
{
        int sum2 = 0;
        for (int i = 1; i <=n; i++)
        {
                int sum = 1;
                for (int j = 1; j <= i; j++)
                {
                        sum = sum*j;
                }
                sum2 = sum2 + sum;
               
        }
        cout << sum2<<endl;
        return 0;
}
*/上面是求n!;
下面是求 1!+2!+3!....+n!
可不可以把下面的利用递归实现啊

yingg 发表于 2016-11-5 22:30:44

求指教。

LiFi 发表于 2016-11-6 09:09:33

表示看不懂!!!!!

小圈圈 发表于 2016-11-6 11:24:49

口以的,但是目测n大的话会很卡,能不用递归就不用递归,速度很慢的,除非你没其他思路了

ttl255 发表于 2016-11-6 20:48:08

RE: 各位咱们讨论一下递归吧!

本帖最后由 ttl255 于 2016-11-6 22:30 编辑

作业题?

为啥都用C++了 还用C的代码风格
我就过来划水的
笑笑就好


#include <iostream>

int factorial(int n);

int main()
{
        int n, sum = 0;
        while ( std::cin >> n)
        {
                for (int i = 1; i <= n; i++)
                {
                        sum += factorial(i);
                }
               std::cout << sum <<std::endl;
        }
        return 0;
}


int factorial(int n)
{
        if (n > 1)
        {
                return n * factorial(n - 1);
        }
        else
        {
                return n;
        }
}

xiaoye 发表于 2016-11-7 13:17:56



思路,递归进行时暗含了循环,循环条件是 if (x == 0)并返回1作为结束。
这个1返回去,就是当前循环的结果。

当4进入时
long factorial(long4)
{               
      if (x == 0) return 1;      //结束递归
      else return 4*factorial(4 - 1) ;
}
得到:factorial(3)
long factorial(long3)
{               
      if (x == 0) return 1;      //结束递归
      else return3*factorial(3 - 1) ;
}
得到:factorial(2)
long factorial(long2)
{               
      if (x == 0) return 1;      //结束递归
      else return 2*factorial(2 - 1) ;
}
得到:factorial(1)
long factorial(long1)
{               
      if (x == 0) return 1;      //结束递归
      else return 1*factorial(1 - 1) ;
}

得到:factorial(0)
long factorial(long0)
{               
      if (x == 0) return 1;      //结束递归
      else return 1*factorial(1 - 1) ;
}


从后面看起,
long factorial(long0)结果是 1;
long factorial(long1)结果是 :1*factorial(1 - 1)= 1*1 ;
long factorial(long2) )结果是 :2*factorial(2 - 1) = 2*1 ;
….
….

int _tmain(int argc, _TCHAR* argv[])
{
      int sum2 = 0;
      for (int i = 1; i <=4; i++)
      {
                int sum = 1;
                for (int j = 1; j <= i; j++)
                {
                        sum = sum*j;
                }
                sum2 = sum2 + sum;
               
      }
      cout << sum2<<endl;
      return 0;
}

可以不用按他的模板做。
1!+2!+3!....+n!可以设置n每次 n-- 依次减一;
使用递归(按上面的递归方式,)
直到n = 1时。返回1
返回去的1+前面的2 (return 1*factorial(1 - 1)改return 1 +factorial(*)) ;
这样就实现n!
)
说到这里。应该想的出来了,代码不写了。
页: [1]
查看完整版本: 各位咱们讨论一下递归吧!