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 他们的数据类型