1. 程式人生 > >C/C++ 遞迴 求前n項階乘的值 /和

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 他們的資料型別