美文网首页
超脱自然,非同凡响!C语言递归算法

超脱自然,非同凡响!C语言递归算法

作者: 启明_b56f | 来源:发表于2018-06-02 22:21 被阅读0次

俗话说“”迭代是人,递归是神“”

那递归神在什么地方?

简单地说,递归是函数内的层层循环找结果

引用一下专业术语:

在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。

递归在程序编程多次用到

简单的弄一个求阶乘的递归算法吧:

一个数的阶乘就是这个数连乘每个比前一个数小1的数,例如5的阶乘是:5 * 4 * 3 * 2 * 1, 0和1的阶乘是1.用公式实现:

fac(n) = 1 n=1 ,n=0

n * fac(n - 1) n > 1

#include "stdafx.h"

int fac(int n)

{

if (n == 0 || n == 1)

return 1;

return n*fac(n - 1);

}

int _tmain(int argc, _TCHAR* argv[])

{

printf("%d ", fac(3));

printf("%d ", fac(5));

printf("%d ", fac(7));

return 0;

}

分别求出3,5,7的阶乘

3!=6,5!=120,7!=5040

这还只是简单的递归阶乘算法,但却看出它的神奇所在吧!

接下来就要领会下用递归做的斐波那契数列吧

来看看基本定义:

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368[1]

斐波那契数列特别指出:第0项是0,第1项是第一个1。

这个数列从第3项开始,每一项都等于前两项之和。

斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的列昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点相当于今日的阿尔及利亚地区,列昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。

递推公式

斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

如果设F(n)为该数列的第n项(n∈N+)。那么这句话可以写成如下形式:

显然这是一个线性递推数列

写个程序了解一下吧

int fib(int n)

{

if (n == 0)

return 0;

if (n == 1)

return 1;

return fib(n - 1) + fib(n - 2);

}

int _tmain(int argc, _TCHAR* argv[])

{

printf("%d ", fib(3));

printf("%d ", fib(5));

printf("%d ", fib(7));

return 0;

}

当n==1是为1,当n==0为0,fib(2)=fib(1)+fib(0)=1+0等于1fib(3)=fib(2)+fib(1)=2,,同理fib(5)和fib(7)分别是5和13

除此之外斐波那契数列还有许多表示方法,下面就再列举两个吧。

方法一:利用公式每次计算出2个斐波那契数列值,直接输出。由于每次输出2个数,所以循环20次可输出40个数。

#define N 40

int main(void)

{

int f1=1,f2=1;

int i;

for(i=1; i<=N/2; i++ )

{

printf("%15d%15d", f1, f2);

if(i%2==0)

printf(" ");

f1 += f2;

f2 += f1;

}

return 0;

}

方法二:利用数组计算并保存前40个斐波那契数列的数(不输出第0项),然后循环40次输出数组元素。

分析:根据斐波那契数列的特征,利用数组可计算数列的前40个数为:

fib[0]= fib[1]=1,

fib[2]= fib[1]+ fib[0],…

从第3个数开始可以用下式计算:

fib[n]= fib[n-1]+fib[n-2] (2≤n≤39)

源程序:

#include

#define N 40

int main(void)

{

int i;

int fib[N]={1,1};

for(i=2;i

fib[i]=fib[i-1]+fib[i-2];

for(i=0;i

{

if(i%4==0) printf(" ");

printf("%15d",fib[i]);

}

return 0;

}

除此之外递归的应用还有很多种,远不止这一些。。。。。

玩玩其他操作

int fac(int n)

{

for (int i = 0; i < n; i++)

printf(" ");

printf("factorial: %d ", n);

if (n == 0)

{

printf("returning : 1 ");

return 1;

}

else

{

int result = n*fac(n - 1);

for (int i = 0; i < n; i++)

printf(" ");

printf("returning: %d ", result);

return result;

}

}

int main()

{

fac(5);

getchar();

return 0;

}

相关文章

  • 超脱自然,非同凡响!C语言递归算法

    俗话说“”迭代是人,递归是神“” 那递归神在什么地方? 简单地说,递归是函数内的层层循环找结果 引用一下专业术语:...

  • C语言基础教程之递归

    一文读懂C语言递归算法,C语言基础教程之递归 C语言递归 递归指的是在函数的定义中使用函数自身的方法。 从前有座山...

  • 非同凡响

    写给那些疯狂的人 那些不合群的 那些叛逆的 那些格格不入的 那些用不同眼光看待事物的 那些不喜欢循规蹈矩的 那些不...

  • 非同凡响

    伟大的领袖绝非偶然,也绝非晋通,读乔布斯传的时候,我真实感受到其中的非同凡响,细数下来,他们分别是: 追求完美,乔...

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • OC阶乘计算

    OC中的阶乘算法,原理就是递归。在OC中也可以用c语言来实现。

  • 非同凡响的美丽,戚薇的新春写真!

    非同凡响的美丽, 戚薇的新年写真! 非同凡响的美丽, 戚薇的性感写真!

  • 从斐波那契数列看递归与动态规划

    递归算法就是通过解决同一问题的一个或多个更小的实例来最终解决一个大问题的算法。为了在C语言中实现递归算法,常常使用...

  • C语言中的递归程序可以用非递归算法实现吗?

    C语言所有递归都可以用非递归算法实现,最典型的就是迭代法,有时比递归更容易理解。至于递归中的形式参数是自动变量,没...

  • 3  仗剑天涯

    3 仗剑天涯 一个天赋异禀的青年如太白,他拥有过这个世间的繁华和荣誉,他的理想也非同凡响,也超脱于这个世间。 他的...

网友评论

      本文标题:超脱自然,非同凡响!C语言递归算法

      本文链接:https://www.haomeiwen.com/subject/asldsftx.html