免费注册 查看新帖 |

Chinaunix

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

[学习共享] 来写几段天书式的dc程序 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-12-04 22:16 |只看该作者
回复 30# 星条旗


    ... 我以为是 dc 写的各种代码呢 ..

论坛徽章:
0
32 [报告]
发表于 2012-12-05 09:58 |只看该作者
标题写的就好

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
33 [报告]
发表于 2013-01-17 23:15 |只看该作者
你好,这里提到使用dc来求质数。我仔细看了看,并且运行了一下,发现运行正常。
我又想从另外一个比较大的数开始求质数,我把命令改成如下:
  echo '2p3p7000000001p[dlAd2+sA%0=ClAlG!<B]sB[sE0dsG]sC[p]sF[ddvsG3sAlBx0<F2+lDx]dsDx' | dc,
能够正常运行,但是我再次修改了一下:

echo '2p3p8000000001p[dlAd2+sA%0=ClAlG!<B]sB[sE0dsG]sC[p]sF[ddvsG3sAlBx0<F2+lDx]dsDx' | dc,
这时会报错“段错误”,我不明白是为什么。想请人解释一下。
“段错误”是指什么意思?为什么会发生段错误?

论坛徽章:
0
34 [报告]
发表于 2013-01-18 01:05 |只看该作者
回复 33# shencz2000


    dc 的解释器上一次更新是在 1998 年 = =..
    估计是因为没什么人用
   
    没有尾递归的处理,因此会爆栈,产生段错误
    前两天给现有解释器打了个补丁,想要可以给你
    可以处理尾递归了,但对于能够爆栈的数据规模,即使不爆栈也会跑的死慢
    因此建议不要试图用 dc 算大规模的问题 ..

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
35 [报告]
发表于 2013-01-18 01:14 |只看该作者
本帖最后由 shencz2000 于 2013-01-18 01:16 编辑

你好,我读了上面的命令,主栈的操作数并不多,没有出现不停的压栈的命令,其它寄存器也没有进行栈操作。这样又怎么会出现爆栈问题?我是新手不懂,请解释。我觉得上面的命令是循环,不是递归。不知道说的对不对?

论坛徽章:
0
36 [报告]
发表于 2013-01-18 01:36 |只看该作者
本帖最后由 hbmhalley 于 2013-01-18 01:37 编辑

回复 35# shencz2000


echo '2p3p8000000001p[dlAd2+sA%0=ClAlG!<B]sB[sE0dsG]sC[p]sF[ddvsG3sAlBx0<F2+lDx]dsDx' | dc

蓝字都是递归

你可以理解成循环
但现有版本的解释器懒得拐这个弯
在看到蓝字的时候,它不知道后面还有没有命令待执行(+事实上想要知道很容易),于是不作处理 直接递归

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
37 [报告]
发表于 2013-01-18 01:52 |只看该作者
本帖最后由 shencz2000 于 2013-01-18 01:56 编辑

你好,一般来说递归要存储大量的数据,但是循环不一定要存储大量数据。比如做 N 阶乘 ,如果写成for循环,只需要几个寄存器就够了。但是如果写成递归,可能需要存储大约N个数据之多。另外,很抱歉的是,我看不出上面的命令是递归。蓝字标示的几个字母前一个是循环,后一个是死循环。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
38 [报告]
发表于 2013-01-19 18:44 |只看该作者
本帖最后由 shencz2000 于 2013-01-19 19:04 编辑

在centos下,要显示dc的版本,可以输入命令:dc -V,显示如下:
dc (GNU bc 1 . 06) 1 . 3
Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc.

要显示bc的版本,可以输入命令: bc -v,显示如下
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.


这是不是说,现在linux里的dc是以bc程序为基础编写的?

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19CU十二周年纪念徽章
日期:2013-10-24 15:41:34
39 [报告]
发表于 2013-01-19 19:01 |只看该作者
本帖最后由 shencz2000 于 2013-01-19 19:05 编辑

前面提到了“段错误”。使用中发现,dc的出错提示是用英语给出,但是“段错误”是用中文给出,因此这个提示是bash给出的错误。
输入命令:bash --version,显示如下:
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

看来dc程序使用的资源超出了bash的限制。

论坛徽章:
0
40 [报告]
发表于 2013-01-19 19:45 |只看该作者
本帖最后由 hbmhalley 于 2013-01-19 19:46 编辑

回复 37# shencz2000


    举个例子

    function a { echo $1 ; if [[ $1 -gt 1 ]]; then a $(($1-1)) ; fi ; echo $1 ; }
    a 9

    循环还是递归?

    9 [p d1- d0<a st p] dsax

    循环还是递归?

    function a() { echo 1 ; a ; }

    循环还是递归?

    1 [p lax] dsax

    循环还是递归?

这是不是说,现在linux里的dc是以bc程序为基础编写的?


    不是。曾经的 bc 是以 dc 为基础写的
    dc 从十五年前就没更新过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP