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

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

那递归神在什么地方?

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

引用一下专业术语:

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

使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如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;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容