递归算法研究 c语言,基于C语言的递归算法研究

132

第 36 卷 数字技术与应用 www.szjsyyy.com

递归是C语言中经常使用的将复杂问题简单解决的方法,递归

作为一种算法在程序设计语言中广泛应用。C语言中当一个函数直

接或间接调用该函数本身时,就被称为函数的递归调用。递归的基

本思想是将原问题转化为规模缩小了的同类问题的子问题,然后递

归调用该函数来表示问题的解[1]。

1 递归调用的条件

在解决实际问题时,能否用递归的方法来解决,取决于问题自

身的特点。一个问题要用递归的方法来解决,需满足以下条件:

(1)原问题可转化为一个新问题,而这个新问题与原问题有相同

的解决方法。

(2)新问题可继续这种转化,在转化过程中,问题有规律地递增

或递减。

(3)在有限次转化后,问题得到解决,即具备递归结束的条件。

2 利用递归求解最大公约数

C语言中用递归方式计算两个正整数a1,b1的最大公约数,实

质它依赖于下面的定理:

a1 b1=0

gcd(a1,b1) =

gcd(b1,a1 mod b1) b1!=0

从该定理我们可以看出它是符合上述条件的,首先将求解最大

公约数gcd(a1,b1)转化成了一个新问题gcd(b1,a1 mod b1),而这

个新问题与原问题有相同的解决方法;其次第二个参数经过多次取

余后一直在变小;经过有限次的调用后b1=0,出现递归边界,结束递

归调用。

C语言的源代码如下:

int gcd (int a1,int b1)

{ if(a1%b1==0)

return b1;

else

return gcd(b1,a1%b1);

}

#include "stdio.h"

main()

{

int c,d,t;

printf("请输入两个整数:");

scanf("%d%d",&c,&d);

t1=gcd(c,d);

printf("最大公约数是 %d\n",t);/*最大公约数*/

}

如果输入的两个数是8和6,需要计算gcd(8,6)由于6不是边界

值,需要计算gcd(6,2),由于2也不是边界值,需要计算gcd(2,0),此时

出现边界值,gcd(2,0)的结果是2,向上返回gcd(6,2)的结果也是2,再

向上返回gcd(8,6)的结果也是2,最后求得8和6的最大公约数是2。

由公式: c%d<=c/2 可知:每次递归调用,问题的规模减小一

半,类似于二分查找,这显然是一个非常好的算法。

由于程序前4行,花费的时间为常量时间,在第5行进行递归调

用,问题规模减少一半。可得出,T(N) = T(N/2)+O(1) 推出:时间

复杂度为O(logN)。

3 利用循环语句求解最大公约数

穷举法,也叫枚举法。穷举法求两个正整数的最大公约数就是

利用循环语句进行求解,其解题步骤:从两个数中较小数开始由大

到小列举,直到找到公约数立即中断列举,得到的公约数便是最大

公约数。

C语言的源代码如下:

int divisor (int a1,int b1) /*自定义函数求两数的最大公

约数*/

{

int temp; /*定义整型变量*/

temp=(a1>b1)b1:a1; /*采种条件运算表达式求出两个数中

的最小值*/

while(temp>0)

{

if (a1%temp==0&&b1%temp==0) /*只要找到一个数能同

基于C语言的递归算法研究

刘卓亚

(云南机电职业技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值