免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: feiyang21687
打印 上一主题 下一主题

[函数] 求助一个用堆栈来模拟fibr递归函数实现 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-02-04 11:15 |只看该作者
>> 7,3,1,2,1,1,4,2,1,1,2,1,1
这个是怎么得来的?

这个序列就是递归调用时候堆栈里面的存储数据的顺序,我是通过把递归式展开得到的这个序列。这个序列可以用一棵二叉树来描述。
PS.你也是北邮的吗?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
12 [报告]
发表于 2007-02-04 11:18 |只看该作者
修正LZ递推式f(n)=f(n/2)+f((n+1)/2)+n,f(1)=1

论坛徽章:
0
13 [报告]
发表于 2007-02-04 11:54 |只看该作者
原帖由 cobras 于 2007-2-4 11:18 发表
修正LZ递推式f(n)=f(n/2)+f((n+1)/2)+n,f(1)=1

楼主的递推式是正确的
原本的式子是要计算f( more(n/2) ) + f( less(n/2) ) + n,其中more(n/2)表示不大于n/2的最大的整数,less(n/2)表示大于n/2最小的整数

例如:
当 n = 2 时,more(n/2) = more(2/2) = 1, less(n/2) = less(2/2) = 2,所以 f(2) = f(1) + f(2) + 2 (无限递归)
而你的递推式有:f(2) = f(1) + f(1) + 2,所以你的是不正确
(注意:上面递推式中n/2作了向下取整计算)

另外,按照楼主的要求,必须给定 f(1) 和 f(2) 的初值才行
more(n/2) <= n/2 <less(n/2),more和less相差1

论坛徽章:
0
14 [报告]
发表于 2007-02-04 11:56 |只看该作者
原帖由 feiyang21687 于 2007-2-4 11:15 发表

这个序列就是递归调用时候堆栈里面的存储数据的顺序,我是通过把递归式展开得到的这个序列。这个序列可以用一棵二叉树来描述。
PS.你也是北邮的吗?

不知道你是按哪个公式展开的,我展开结果不是这样的

PS:不是的^_^

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
15 [报告]
发表于 2007-02-04 11:58 |只看该作者
用我的递推式才可得到楼主需要的序列

论坛徽章:
0
16 [报告]
发表于 2007-02-04 12:21 |只看该作者
原帖由 cobras 于 2007-2-4 11:13 发表
如下是模拟栈的递归实现(如果学过编译原理就不难理解)
fibr函数是C递归代码,main中的是模拟递归代码
[code]
#include <stdio.h>
#include <stdlib.h>

#define ALEN(v) (sizeof(v)/sizeof(( ...

很不错,赞一个
用我的递推式才可得到楼主需要的序列

恩,不过,就怕他序列推错了,呵呵

论坛徽章:
0
17 [报告]
发表于 2007-02-04 16:06 |只看该作者
原帖由 cobras 于 2007-2-4 11:13 发表
如下是模拟栈的递归实现(如果学过编译原理就不难理解)
fibr函数是C递归代码,main中的是模拟递归代码
[code]
#include <stdio.h>
#include <stdlib.h>

#define ALEN(v) (sizeof(v)/sizeof(( ...




如果按楼主所说的,要求效率高,空间利用率高,这不是摆明了要再去增加一个寄存器吗?

论坛徽章:
0
18 [报告]
发表于 2007-02-05 00:07 |只看该作者

  1.         while(ip>=0){
  2.                 switch(ip){
  3.                 case 0:
  4.                         push(bp);
  5.                         bp=sp;
  6.                         printf("%d ", ss[bp+2]);
  7.                         if(ss[bp+2]<=1){
  8.                                 ax=1;
  9.                                 ip=4;
  10.                         }else{
  11.                                 ip=1;
  12.                         }
  13.                         break;
  14.                 case 1:
  15.                         push(ss[bp+2]/2);
  16.                         call();
  17.                         break;
  18.                 case 2:
  19.                         sp+=1;
  20.                         push(ax);
  21.                         push((ss[bp+2]+1)/2);
  22.                         call();
  23.                         break;
  24.                 case 3:
  25.                         sp+=1;
  26.                         ax+=pop()+ss[bp+2];
  27.                         ip=4;
  28.                         break;
  29.                 case 4:
  30.                         bp=pop();
  31.                         ret();
  32.                         break;
  33.                 }
  34.         }
复制代码

小弟愚笨,这段代码不甚明白,是否可以说明一下。多谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP