4370|4

57

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

c51中递归调用如何使用? [复制链接]

我写了一个小程序,在c51中编译结果总是0,我知道是变量覆盖问题,但我不知道如何去写,请教大虾!!!

#include
int factorial( int n);
int factorial( int n)
{
int result;
if(n == 0)
        result=1;
else
        result=n*factorial(n-1);//递归调用
        return(result);
}

main()
{
int j=0,a=0;
for(j=0;j<11;++j)
     a = factorial(j);
while(1);
}

最新回复

呵呵,在程序中我用at89c51单片机就会出现上面的错误,但用at89c52就不会了。 不知道哪位能帮我解释一下?   详情 回复 发表于 2009-8-21 22:39
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
reentrant

声明函数为可重入,再递归即可

但是51上尽量避免递归,甚至可以禁止用递归

因为RAM真的是太小了,如非用不可,那么递归层次必须能估算在资源允许的范围内

而且要严格检查递归条件

最后在系统压力测试时要给足压力

最后:51下递归能不用还是不用吧...
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
程序本身没有问题
但是递归调用需要非常大的堆栈,并且在运行时才能最终确定具体需要多少堆栈
估计是你的堆栈不够大,或者是你的RAM太小
所以单片机这种小内存的设备,最好不要用递归
另外单片机的int型是16位的10的阶乘已经大于int型的最大值了,即溢出了
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用楼主 leiyun121 的回复:
我写了一个小程序,在c51中编译结果总是0,我知道是变量覆盖问题,但我不知道如何去写,请教大虾!!!

#include
int ? factorial( ? int ? n);
int ? factorial( ? int ? n)
{
int ? result;
if(n ? == ? 0)
result=1;
else
result=n*factorial(n-1);//递归调用
return(result);
}

main()
{
int ? j=0,a=0;
for(j=0;j <11;++j)
? ? ? ? ? a ? = ? factorial(j);
? while(1);
}



确实是这样,谢谢lbing7!!
但还有点小小的问题,就是我在单步运行的时候,会有下面的错误:
*** error 65: access violation at I:0xFE : no 'write' permission
*** error 65: access violation at I:0xFF : no 'write' permission
*** error 65: access violation at I:0xFE : no 'read' permission

不知道是怎么回事?是不是chngok所说的内存不够或溢出?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
呵呵,在程序中我用at89c51单片机就会出现上面的错误,但用at89c52就不会了。
不知道哪位能帮我解释一下?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表