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

来源:互联网 发布:photoshop for linux 编辑:程序博客网 时间:2024/06/06 00:30

一、递归

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

1

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

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

  • F_0=0
  • F_1=1
  • F_n = F_{n-1}+ F_{n-2}
递归是完成费波那西数列计算的方法之一,费波那西数列由01开始,之后的费波那西系数就由之前的两数相加。在数学上,费波那西数列就是如下这种递归的方法来定义:


麦好的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);

        }

}

执行程序,main40为参数n的值,调用fibfib陆续输出前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函数执行中用到,使用完毕后堆栈空间就将本次所用的参数释放。fibfib自身进行不断调用(代码中的“fib_n(next, curr+next, n-1)),每次调用fib_n函数,curr参数在增长中(curr参数表示数列中的当前项,初始值为0,每次新值为next),而next参数也在增长(next参数表示数列中的下一项,初始值为1,每次新值为curr+next),n参数在减少中(n是一个计数器,注意这个计数器到0才算结束,每次减少1n初始值为40n控制了生成的费波那西数列数的数量)。

(2)n值等于0时,所有对fib函数的调用结束了,生成的费波那西数的数量达到了程序要求。在数列的开始处(代码中的“n==0),最后一次调用fib函数完成,函数返回了程序要求的数列中最后一个数的计算(代码中的“return curr;”),这时的curr等于102334155)

 

2、计算器的实现

(1)perl配合正则表达式利用堆栈完成

http://blog.csdn.net/myhaspl/article/details/17168889

(2)Felx/bisonC语言完成

http://blog.csdn.net/myhaspl/article/details/17481491

0 0
原创粉丝点击