免费注册 查看新帖 |

Chinaunix

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

[算法] 不简单的strlen长度计算, [复制链接]

论坛徽章:
0
71 [报告]
发表于 2009-05-16 11:54 |只看该作者
原帖由 皇家救星 于 2009-5-12 22:38 发表

int strlen(char *p)  // 注意! 不允许定义任何变量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}

Beautiful code! 学习了!

论坛徽章:
0
72 [报告]
发表于 2009-05-16 14:20 |只看该作者
公司拿种题目考验人真没意思。

论坛徽章:
0
73 [报告]
发表于 2009-05-16 18:12 |只看该作者
递归解决:
int strlen(char *p)
{
        if(*p)
        {
                return strlen(++p) + 1;
        }
        return 0;
}

论坛徽章:
0
74 [报告]
发表于 2009-05-16 20:41 |只看该作者
int strlen(char *s)
{
      return  (s==NULL) ? 0 : strlen(s)+1;
}

论坛徽章:
0
75 [报告]
发表于 2009-05-16 21:28 |只看该作者


[ 本帖最后由 bandaotidejia 于 2009-5-16 21:40 编辑 ]

论坛徽章:
0
76 [报告]
发表于 2009-05-16 21:55 |只看该作者
int strlen(char *p)
{
if(p==0)
return -1;
if(*p=='\0')
return 0;
else
return strlen(p+1)+1;
}

论坛徽章:
0
77 [报告]
发表于 2009-05-17 01:13 |只看该作者
公子兄这个版本也还是有限制啊,只适用堆栈由高地址向低地址生长的情况,能事先对栈的生长方向进行判断吗?



原帖由 sanbiangongzi 于 2009-5-14 13:56 发表
还有一个版本

int lenstr2(char *p)
{
#define i (*(int*)(&p - 3))
    for(i=0; p\[i\]; i++);
    return i;
#undef i
}

[ 本帖最后由 Scorpioo 于 2009-5-17 01:17 编辑 ]

论坛徽章:
0
78 [报告]
发表于 2009-05-17 08:51 |只看该作者
int strlen(char *p)  // 注意! 不允许定义任何变量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}

这个算tail recursive,和普通的for一样的效率。

论坛徽章:
0
79 [报告]
发表于 2009-05-17 10:42 |只看该作者
赞一个,很专业的说

论坛徽章:
0
80 [报告]
发表于 2009-05-17 11:20 |只看该作者
原帖由 snnn 于 2009-5-17 08:51 发表
int strlen(char *p)  // 注意! 不允许定义任何变量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}

这个算tail recursive,和普通的for一样的效率。


会是一样吗? 你gcc -S 编译出来读一下汇编文件.看看有什么不同?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP