数据结构和算法分析

第一章 引论

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 运行时间分析

Important things

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值