您的位置:首页 > 其它

C指针原理(77)-递归(1)

2014-01-29 11:06 176 查看
一、递归
递归在计算机科学中,是指在函数的定义中使用函数自身的方法,递归是进行循环的一种技巧(在类lisp等函数语言中它也是实现循环的主要甚至唯一途径,比如下面的LISP代码)。
1、


费波那西数列(意大利语:Successione di Fibonacci),又译费波拿契数斐波那契数列费氏数列黄金分割数列

在数学上,费波那西数列是以递归的方法来定义:







递归是完成费波那西数列计算的方法之一,费波那西数列由0和1开始,之后的费波那西系数就由之前的两数相加。在数学上,费波那西数列就是以如下这种递归的方法来定义:


麦好的AI乐园博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/myhaspl/

1、下面的 fib函数是C语言的实现,函数反复调用自身实现计算
执行上述程序:
#include <stdio.h>
 
long fib_n(long,long,int);
int main(){
fib_n(0, 1, 40);
return 0;
}
int i=0;
long fib_n(long curr,long next,int n) {
printf("第%d项:%ld\n",i++,curr);
        if (n == 0) {
            return curr;
        } else {
            return fib_n(next, curr+next, n-1);
        }
}
执行程序,main以40为参数n的值,调用fib,fib陆续输出前41个费波那西系数的值,也是说数列中的41个数(因为第1个数0不是第一项,而是第零项):
dp@dp:~ % gcc fib.c -o fib
dp@dp:~ % ./fib
第0项:0
第1项:1
第2项:1
第3项:2
第4项:3
第5项:5
第6项:8
第7项:13
第8项:21
第9项:34
第10项:55
第11项:89
第12项:144
第13项:233
第14项:377
第15项:610
第16项:987
第17项:1597
第18项:2584
第19项:4181
第20项:6765
第21项:10946
第22项:17711
第23项:28657
第24项:46368
第25项:75025
第26项:121393
第27项:196418
第28项:317811
第29项:514229
第30项:832040
第31项:1346269
第32项:2178309
第33项:3524578
第34项:5702887
第35项:9227465
第36项:14930352
第37项:24157817
第38项:39088169
第39项:63245986
第40项:102334155
 


麦好的AI乐园博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/myhaspl/

其算法可描述如下:
(1)fib函数在数列不为0时,进入递归状态,反复调用自己(也就是fib)。
这个过程虽然调用的都是fib函数,但每次调用的参数都不一定一致辞,因为每次调用函数,都将新的参数传送给fib函数,每次fib函数的执行需要的参数都是上次fib函数在执行过程中传递的。此外,函数的参数传递方式是通过函数所属的堆栈完成的,这意味着虽然递归多次反复调用fib函数,但参数只是在本次fib函数执行中用到,使用完毕后堆栈空间就将本次所用的参数释放。fib对fib自身进行不断调用(代码中的“fib_n(next, curr+next, n-1)”),每次调用fib_n函数,curr参数在增长中(curr参数表示数列中的当前项,初始值为0,每次新值为next),而next参数也在增长(next参数表示数列中的下一项,初始值为1,每次新值为curr+next),n参数在减少中(n是一个计数器,注意这个计数器到0才算结束,每次减少1,n初始值为40,n控制了生成的费波那西数列的数的数量)。
(2)在n值等于0时,所有对fib函数的调用结束了,生成的费波那西数的数量达到了程序要求。在数列的开始处(代码中的“n==0”),最后一次调用fib函数完成,函数返回了程序要求的数列中最后一个数的计算(代码中的“return curr;”),这时的curr等于102334155)。
 
2、计算器的实现
(1)perl配合正则表达式利用堆栈完成
http://blog.csdn.net/myhaspl/article/details/17168889

(2)Felx/bison用C语言完成
http://blog.csdn.net/myhaspl/article/details/17481491
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: