初学算法-------递归
大部分内容在我的笔记里;
课件上,老师给出了递归的3类使用情境,并举出了相应的事例,分别是:
(1)多重循环(递归层数不确定):N皇后问题
(2)本身用递归形式定义的问题:阶乘、波兰表达式
(3)将问题分解成规模更小的子问题:汉诺塔
https://blog.csdn.net/liliangpin/article/details/90631661这篇文章讲的更好;
这里讲一下不能只依靠递归:
递归中终究还是有一个致命的缺陷就是在递归次数过多时会需要极大的运行空间,甚至会终止程序的运行。所以,在递归和循环的使用上还是要根据具体情况而选择使用;
如
菲波那契数列(2)
1000ms 65536K
描述:
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为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;
}
这也告诉我:当要调用递归很多次时,因为递归很多次白白计算,不妨用循环代替递归,用数组储存好;