初學演算法-------遞迴
大部分內容在我的筆記裡;
這裡講一下不能只依靠遞迴:
遞迴中終究還是有一個致命的缺陷就是在遞迴次數過多時會需要極大的執行空間,甚至會終止程式的執行。所以,在遞迴和迴圈的使用上還是要根據具體情況而選擇使用;
如
菲波那契數列(2)
1000ms65536K
描述:
菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。 給出一個正整數a,要求菲波那契數列中第a個數對1000取模的結果是多少。
輸入:
第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數a(1 <= a <= 1000000)。輸出:
n行,每行輸出對應一個輸入。輸出應是一個正整數,為菲波那契數列中第a個數對1000取模得到的結果。樣例輸入:
4 5 2 19 1
樣例輸出:
5 1 181 1
這裡如果我想先把全部的算出來:
若
#include<iostream>
#include<cstdio>
using namespace std;
long long array[1000000];
long long futher (int num)
{
if (num==1 || num==2)
{
return 1;
}
else
{
return array[num]=futher(num-1)+futher(num-2);
}
}
int main()
{
array[1]=1;
array[2]=1;
futher(1000000);
int t;
scanf ("%d",&t);
while (t--)
{
int n;
scanf ("%d",&n);
printf ("%lld\n",array[n]%1000);
}
return 0;
}
用遞迴會
出問題了,要用迴圈代替:
#include<iostream>
#include<cstdio>
using namespace std;
long long array[1000000];
int main()
{
array[1]=1;
array[2]=1;
for (int i=3;i<=1000000;i++)
{
array[i]=array[i-1]+array[i-2];
array[i]%=1000;
}
int t;
scanf ("%d",&t);
while (t--)
{
int num;
scanf ("%d",&num);
printf ("%lld\n",array[num]);
}
return 0;
}