递归、尾递归、迭代算法【在 斐波拉契数列】上的实现

/*
    递归: 【逆序】从未知点推到已知点,【顺序】代入已知点结果,从已知点带入并计算到未知点,最终到终点
    尾递归: 从起点开始,依顺序计算结果,并无限靠近最终目标点
    迭代: 从起点开始,依顺序计算结果,并无限靠近最终目标点
    
    以如上的三种方式,实现斐波拉契数列 计算
    斐波拉契数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
           { 0,  n=0
    f(n) = { 1,  n=1 n=2
           { f(n-1) + f(n-2)
*/


#include <stdio.h>

/* 递归 */
unsigned int recursion(unsigned int sn)
{
    if (0 == sn)
    {
        return 0;
    }
    else if (   3 > sn
             && sn > 0)
    {
        return 1;
    }
    else
    {
        return recursion(sn-1) + recursion(sn-2);
    }

    printf("recursion:not expect reach!\n");
    return 0;
}

/* 尾递归 */
unsigned int trailRecursion(unsigned int first, unsigned int second, unsigned sn);
unsigned int trailRecursion(unsigned int first, unsigned int second, unsigned sn)
{
    if (0 == sn)
    {
        return 0;
    }
    if (1 == sn)
    {
        return first;
    }
    else if (2 == sn)
    {
        return second;
    }
    else if (3 == sn)
    {
        return first + second;
    }
    else
    {
        return trailRecursion(second, first+second, sn-1);
    }
}
/* 迭代 */
unsigned int iteration(unsigned int sn)
{
    unsigned int first = 1;
    unsigned int second = 1;
    unsigned int curr = 0;

    if (0 == sn)
    {
        return 0;
    }
    else if (1 == sn)
    {
        return first;
    }
    else if (2 == sn)
    {
        return second;
    }
    
    while(sn-- > 2)
    {
        curr = first + second;
        first = second;
        second = curr;
    }
    
    return curr;
}
/* 测试程序 */
int main(void)
{
    unsigned int value = 0;
    unsigned int sn = 10;

    value = recursion(sn);
    printf("fibonacciSequency-recursion-%u: %u\n", sn, value);

    value = trailRecursion(1, 1, 10);
    printf("fibonacciSequency-trailRecursion-%u: %u\n", sn, value);

    value = iteration(10);
    printf("fibonacciSequency-iteration-%u: %u\n", sn, value);

    return 0;
}

posted @ 2018-11-22 22:45  thinking......  阅读(177)  评论(0)    收藏  举报