数据结构笔记 递推与迭代

/*
递推算法:
    通过已知条件,利用特定关系得到中间结论,然后得到最后结果。
    1.顺推法:
        从已知条件出发,逐步推导出要解决问题的方法。
        例如斐波拉契数列。
    2. 逆推法
        根据结果推导出已知条件   
*/ 

// 斐波拉契数列的递推实现

# include <stdio.h>

int main(void)
{
    int Fn, f1, f2;
    // 初始值
    f1 = 1;
    f2 = 1;
    int cnt;
    printf("请输入您想求解的数列元素位数:");
    scanf("%d", &cnt);
    if (1 == cnt)
        Fn = f1;
    else if (2 == cnt)
        Fn = f2;
    else
    {
        int i;
        for (i = 3; i <= cnt; ++i)
        {
            Fn = f1 + f2;
            f1 = f2;
            f2 = Fn;
        }
    } 
    printf("斐波拉契数列中第%d为%d!\n", cnt, Fn);
    
    
    return 0;
} 
/*
迭代算法:
    迭代算法又称为辗转法,是一种不断用旧的变量值递推得到
    新的变量值的过程。
迭代法与递推法相同之处在于都是使用循环语句实现。不同之处
在于,迭代法使用的是 while 循环,而递推法使用的是 for 循
环。迭代法在迭代结束后得到一个解或一组解,递推法的循环控
制变量改变一次就得到一个解,循环结束得到一系列的解。迭代
法的迭代次数事前是未知的,而递推法的递推次数事前是已知的

迭代法分为精确迭代和未知迭代。
精确迭代:
    通过迭代可以得到一个精确的解。例如:求最大公约数,进
    制转换,质因数的分解 ,谷角猜想。
近似迭代:
    通过迭代得到近似的解。例如:二分法,求定积分。 
*/ 

// 利用精确迭代法求最大公约数和最小公倍数

# include <stdio.h>

int main(void)
{
    int i, j;
    printf("请输入两个正整数:");
    scanf("%d %d", &i, &j);
    int r;  //  表示余数
    int f1, f2;
    if (i < j)
    {
        f1 = j;
        f2 = i;
    } 
    else
    {
        f1 = i;
        f2 = j;
    }
    while (0 != (f1 % f2))
    {
        r = f1 % f2;
        f1 = f2;
        f2 = r;
    }
    printf("最大公约数为 %d\n最小公倍数为 %d\n", r, i*j/r);
    
    return 0;
} 

 

posted @ 2017-04-27 21:01  荒唐了年少  阅读(844)  评论(0编辑  收藏  举报