第一章 引论
Summary
1.1本书讨论的内容 | 1.2数学知识的复习 | 1.3递归简论 |
---|---|---|
了解程序在适当输入和巨大 输入时的差别,明白优化代 码采取适当数据结构的重要 | 指数、对数、级数、模运 算、归纳法反证法证明 | 指在函数的定义中使用 函数自身的方法,还较常 用于描述以自相似方法 重复事物的过程。也可 以理解为自我复制的过程。 |
Important things
递归
在数学上,费波那契数列是以递归的方法来定义:
F_{0}=0}
F_{1}=1}
F_{n}=F_{n-1}+F_{n-2}}(n≧2)
经过适当的分析,可以知道这个问题是属于斐波那契数列,可以用递归的思想解决。所谓递归算法,就是一种直接或间接地调用原算法本身的一种算法。
在设计递归算法时要注意以下几点:
* 每个递归算法都必须有一个非递归定义的初始值,作为递归结束标志,或递归结束的出口。
* 在设计递归算法时,要解决的问题须具有递归性。
* 虽然采用递归算法解决问题,特别是一些复杂问题时非常方便且容易实现,但是递归算法的运行效率较低,时间和空间复杂度都很高,因此对于一些对时间和空间复杂度要求较高的程序,建议使用非递归算法设计。
运用递归设计的本题求解程序如下所示:
#include <stdio.h>
int f(int n){
if(n<=2) return n;
else return f(n-1)+f(n-2);
}
int main()
{
int n,i;
int a[200];
scanf("%d", &n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
printf("%d\n",f(a[i]));
}
return 0;
}
可以发现当输入的书稍微大一点是便会出现“TLE
可以改用循环的方法设计另一种程序。
#include <stdio.h>
int f(int n){
int i;
int result = 0;
int first = 1,second = 1;
if(n<=2){
return n;
}
else
for(i=1;i<n;i++){
result = first + second;
first =second;
second = result;
}
return result;
}
int main()
{
int n,i;
int a[200];
scanf("%d", &n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
printf("%d\n",f(a[i]));
}
return 0;
}
结果如下所示:
第二章 算法分析
Summsry
2.1 数学基础 | 2.2 模型 | 2.3 要分析的问题 | 2.4 运行时间分析 |
---|