递归、尾递归、迭代算法【在 斐波拉契数列】上的实现
/*
递归: 【逆序】从未知点推到已知点,【顺序】代入已知点结果,从已知点带入并计算到未知点,最终到终点
尾递归: 从起点开始,依顺序计算结果,并无限靠近最终目标点
迭代: 从起点开始,依顺序计算结果,并无限靠近最终目标点
以如上的三种方式,实现斐波拉契数列 计算
斐波拉契数列: 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;
}

浙公网安备 33010602011771号