c语言void递归函数,c语言 - 递归函数-斐波那契数列

递归函数有三个充分条件:第一是函数体,第二是递归区间,第三个是终止条件,

斐波那契数列

例:求斐波那契数列第n项。斐波那契数列的第一项和第二项是1,后面每一项是前两项之和,即1,1,2,3,5,8,13,。。。

下面程序采用直接递归调用:

#include

long fib(int n)

{

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

return 1;

else

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

}

int main()

{

int i;

for(i = 0;i < 8;i++)

printf("%ld ",fib(i));

printf("\n");

return 0;

}

程序执行结果如下:

fs@ubuntu:~/qiang/digui$ ./digui1

1 1 2 3 5 8 13 21

递归的条件:

上面已经简单提到,现在再说明一下

一个问题能否用递归来实现,看其是否有如下特点:

1、须有完成函数任务的语句。

例如:下面的代码定义了一个递归函数

#include

void count(int val)

{

if (val > 1)

count(val - 1);

printf("OK:%d\n",val);

}

该函数的任务是在输出设备上显示”ok: 整数值“。

2、一个任务是否能够避免递归调用的测试。

例如,上面的代码中,语句"if (val > 1)"便是一个测试,如果不满足条件,就不进行递归调用。

3、一个递归调用语句

该递归调用语句的参数应该逐渐逼近不满足条件,以至最后断绝递归。

例如,上面的代码汇总,语句 "if( val > 1)"便是一个递归调用,参数在渐渐变小,这话总发展趋势能使测试 "if (val > 1)"最终不满足。

4,、先测试,后递归调用

在递归函数定义中,必须先测试,后递归调用。也就是说,递归调用是有条件的,满足了条件,才可以递归。

例如,下面的代码无限制的调用函数自己,造成无限制递归,终将使栈空间溢出;

#include

void count(int val)

{

count(val - 1);//无限制递归

if (val > 1)

printf("OK:%d\n",val);

}

下面是完整程序:

#include

void count(int val)

{

if (val > 1)

count(val - 1);

printf("OK:%d\n",val);

}

int main()

{

int n = 10;

count(n);

return 0;

}

程序执行结果如下:

fs@ubuntu:~/qiang/digui$ vi digui2.c

fs@ubuntu:~/qiang/digui$ gcc -o digui2 digui2.c

fs@ubuntu:~/qiang/digui$ ./digui2

OK:1

OK:2

OK:3

OK:4

OK:5

OK:6

OK:7

OK:8

OK:9

OK:10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值