C/C++ 遞迴 求前n項階乘的值 /和
阿新 • • 發佈:2019-02-05
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 他們的資料型別