一道面试题---北电的,请进......

free131 2006-04-07 09:43:20
static int f(int i)
{
return f(i-1)*f(i-1);
}

这个函数在调用的时候为什么会终止呢(VC6.0),按我的理解应该是一个无限递归才对啊

还有f(i-1)*f(i-1)的执行过程到底是怎样的,乘号右边的f(i-1)会执行到吗?

请达人说一说
...全文
491 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx1983 2006-04-07
  • 打赏
  • 举报
回复
听说*的操作数计算顺序没有定义,那么说不定是先执行右边的,而左边的不会执行……
jixingzhong 2006-04-07
  • 打赏
  • 举报
回复
流程,解f(3):
举个例子, 楼主的程序加个终结条件:

int f(int i)
{
if(i == 1 )return 2;
return f(i-1)*f(i-1);
}

那么
1:f(3) = f(2)*f(2)
2:左边f(2) = f(1)*f(1)
3:左边f(1) = 2,返回第二步
4:左边f(2) = 2*f(1) = 2*2(这里的递归就不列出来了) = 4,返回第一步
5:f(3) = 4*f(2),继续递归计算右边f(2) ...

但是由于楼主的程序没有左边递归的终结,
无限递归必然导致内存不足,
右边的自然就不会执行 ...
jixingzhong 2006-04-07
  • 打赏
  • 举报
回复
还有f(i-1)*f(i-1)的执行过程到底是怎样的,乘号右边的f(i-1)会执行到吗?
---------------------------------
乘号右边的f(i-1)应该没有执行的机会了 ...

由于没有终止条件,
左边的f(i-1)会一直递归,
直至内存耗尽...

右边的自然就没有机会了 ~
yuanchuang 2006-04-07
  • 打赏
  • 举报
回复
这又是一个求值顺序的问题。
给你个链接:
http://blog.csdn.net/yuanchuang/archive/2006/03/20/629723.aspx
yuanchuang 2006-04-07
  • 打赏
  • 举报
回复
应该是无限循环。




还有f(i-1)*f(i-1)的执行过程到底是怎样的,乘号右边的f(i-1)会执行到吗?
---------------------------------------------------------------------------
编译器不同,先执行的也不同,有的先执行左边的,那右边的就应该执行不到了
反之亦然
vanlover 2006-04-07
  • 打赏
  • 举报
回复
呵呵,试了试,一楼说的不错
duduhaha 2006-04-07
  • 打赏
  • 举报
回复
你可以自己调试一下,递归调用的开销超出了默认堆栈的大小时就会退出.当然堆栈大小可以设置.
对于下面的程序.
#include <stdio.h>

static int f(int i)
{
return f(i-1)*f(i-1);
}


int main()
{
int i = f(10);
printf("%d\n",i);
return 0;

}
我这边看当i = -11763时退出.
alucardpj 2006-04-07
  • 打赏
  • 举报
回复
在dev c++上面是无限递归,你说的终止,会不会是因为栈溢出呀?
adintr 2006-04-07
  • 打赏
  • 举报
回复
大概只会在堆栈用完后程序崩溃而退出
xiangding 2006-04-07
  • 打赏
  • 举报
回复
一定是栈溢出而停止,

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧