查看: 4897|回复: 5

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

[复制链接]
发表于 2016-11-5 22:29:48 | 显示全部楼层 |阅读模式
#include"stdio.h"
#include"iostream"
using namespace std;
#define  n 4
long factorial(long  x)
{               
        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!
可不可以把下面的利用递归实现啊
回复

使用道具 举报

 楼主| 发表于 2016-11-5 22:30:44 | 显示全部楼层
求指教。
回复

使用道具 举报

发表于 2016-11-6 09:09:33 | 显示全部楼层
表示看不懂!!!!!
回复 支持 反对

使用道具 举报

发表于 2016-11-6 11:24:49 | 显示全部楼层
口以的,但是目测n大的话会很卡,能不用递归就不用递归,速度很慢的,除非你没其他思路了
回复 支持 反对

使用道具 举报

发表于 2016-11-6 20:48:08 | 显示全部楼层

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

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

作业题?

为啥都用C++了 还用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;
	}
}
回复 支持 反对

使用道具 举报

发表于 2016-11-7 13:17:56 | 显示全部楼层
[C] 纯文本查看 复制代码

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

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

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


从后面看起,
long factorial(long  0)结果是 1;
long factorial(long  1)结果是 :1*factorial(1 - 1)  = 1*1 ;
long factorial(long  2) )结果是 :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!
)
说到这里。应该想的出来了,代码不写了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

旗下站点

邮箱系统

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2025-5-1 16:16 , Processed in 0.071319 second(s), 17 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部