C/C++ 递归 求前n项阶乘的值 /和

 

1.递归: 直接或者间接的调用自己 

 

2.使用递归的时候注意 3点         

    (1)从什么时候开始

    (2)什么时候结束

     (3)每一次干什么

3. 用递归求前n项阶乘的值(这里求的是前5项阶乘的值)

    代码如下:                                    

C语言实现

#include<stdio.h>
 
//用 递归 求某项阶乘的值 5!=5*4*3*2*1=5*4! 4!=4*3*2*1=4*3! 3!=3*2*1=3*2! 2!=2*1 即fun i*(i-1)   	

int fun(int i)
{
//1.从什么时候结束
	if(1==i)
		return 1;
//2.每一次干什么
	return fun(i-1)*i; //把fun(1)=1的值传入 fun函数中 	fun(2)=fun(1)*2=1*2=2 fun(3)=fun(2)*3=2*3=6 .......fun(5)
}

//求前5项阶层的和
int fun1(int i)
{
	if(i==1)
		return 1;
	return fun1(i-1)+fun(i);//fun(i) 当前阶层的值fun1(i-)+fun(i)=fun1(2)+fun(3)=fun1(1)+fun(2)+fun(3)=1+2+27=30

}

//打印1-100的和
int fun2(int i)//打印1-100的和
{
	if(i==1)
		return 1;
	return i+fun2(i-1);
}

//打印1到100 
void fun3(int i)//打印1到100 打印1次,调用一次递归,显示一次
{
	if(101==i)
		return;
	printf("%-3d",i);
	if(i%10==0)
		printf("\n");
	fun3(i+1);	
}

int main()
{
    printf("5的阶层为%d\n",fun(5));
	printf("前5项阶层和为%d\n",fun1(5));
	printf("1-100的和为%d\n",fun2(100));
	fun3(1);
}

 结果如下

C++实现递归

#include<iostream>
using namespace std;

//用 递归 求某项阶乘的值 5!=5*4*3*2*1 4!=4*3*2*1 3!=3*2*1 2!=2*1 即fun i*(i-1)   	

int fun(int i)

{

//1.从什么时候结束
	if(1==i)
		return 1;
//2.每一次干什么
	return fun(i-1)*i; //把fun(1)=1的值传入 fun函数中 	
}
int main()

{

    cout<<fun(5)<<endl;

}

结果如下:

 

4. 用递归求前n项阶乘的和(这里求的是前5项阶乘的和)

代码如下:

#include<iostream>
using namespace std;

//用 递归 求某项阶乘的 值 5!=5*4*3*2*1	4!=4*3*2*1	3!=3*2*1	2!=2*1	
int fun(int i)
{
//1.从什么时候结束
	if(1==i)
		return 1;
//2.每一次干什么
	return fun(i-1)*i; //把fun(1)=1的值传入 fun函数中 	
}


//用 递归  求某项阶乘 的和 5!=120 4!=24 3!=6 2!=2 1!=1 把当前阶乘的值和下一次阶乘的值相加 

//(先遍历出来,cout<<i<<endl; fun2(i-1)打印出5 4 3 2 1,再调用递归,相加)

int fun2(int i)
{
//遍历出来 1.从什么时候结束
	if(1==i)
		return 1;
//2.每一次干什么

//cout<<i<<endl;

    fun(i);//求第i项阶乘的值

	return fun2(i-1)+fun(i);
}

int main()
{
	cout<<fun2(5)<<endl;
	return 0;

}

注意:当前的递归的值加上下一次的递归的值 就是前n项的和 即 fun2(i-1)+fun(i)

结果如下:

问题 :1、int型的数据范围[-2^31 , 2^31 -1] 即 [-2147483648,2147483647]

例如 求13的阶乘时候,就超过了 出现溢出现象。 所以,可以通过更改数据类型来解决问题

计算器求13!的结果 为 6227020800

代码求的结果 1932053504

解决问题:更改数据类型 double 或者 float 他们的数据类型

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值