版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/9082551.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  想来惭愧,之前写的一篇文章《用awk写递归》里多少是传递了错误的信息。虽然那篇文章目的上是为了给出一种思路,但实际上awk是可以支持函数局部变量的。

  awk对于局部变量的支持比起大多数过程式语言来说很是怪异,它只在函数的参数里支持。所以如果想用局部变量,多少需要改变我们以前的一些习惯。

  于是我们使用这一点,就可以直接写出一个awk下面的递归。举个简单的例子,比如我们想输入一个数n,就算出1+2+...n的值。写法如下:

  

awk '
function sum(n, other_sum)
{
return n==0?other_sum:sum(n-1, other_sum+n)
}
{
print sum($1,0)
}'

  sum在这里作为一个递归,接受两个参数,一个是n,一个是之前的累和结果。这种用法很像函数式编程,比如lisp系。

  以Scheme为例

  

(define (sum n)
(define (_sum n other_sum)
(if (= n ) other_sum (_sum (- n ) (+ other_sum n))))
(_sum n )
)

  为了忏悔,我还是用awk写个函数式风格的汉诺塔程序吧。

#!/usr/bin/awk -f
function connect(a, b)
{
return a "" b
}function other_pos(a, b)
{
return -a-b;
} function sub1(a)
{
return a-;
} function eq(a, b)
{
return a==b;
} function hanoi2(n, from, to)
{
return eq(n,)? "": connect(connect(connect(hanoi2(sub1(n), from, other_pos(from,to)), " "),connect(from, "->")),connect(connect(to, " "),hanoi2(sub1(n), other_pos(from,to), to)))
}
function hanoi(n)
{
return hanoi2(n, , )
}
{
print hanoi($)
}

  运行一下,尝试一下8块饼的汉诺塔怎么移动。

  

$ echo 8 | ./hanoi.awk
1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 3->1 2->3 2->1 3->1 3->2 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3 2->1 3->1 3->2 1->2 3->1 2->3 2->1 3->1 2->3 1->2 1->3 2->3 1->2 3->1 3->2 1->2 1->3 2->3 2->1 3->1 2->3 1->2 1->3 2->3

  注意,前面写函数式风格的时候,我最终还是使用了三目条件运算符,而没有搭建一个函数 

  function cond_op(cond, a, b)
  {
    return cond?a:b;
  }

  因为如果这样搭建,必然会死循环,想想为什么?

awk的递归的更多相关文章

  1. 用awk写递归

    看到自己很多年前写的一篇帖子,觉得有些意义,转录过来,稍加修改. awk是一种脚本语言,语法接近C语言,我比较喜欢用,gawk甚至可以支持tcp/ip,用起来非常方便. awk也支持递归,只是awk不 ...

  2. awk 手册--【转载】

    1. 前言 有关本手册 : 这是一本awk学习指引,  其重点着重于 : l         awk 适于解决哪些问题 ? l         awk 常见的解题模式为何 ? 为使读者快速掌握awk解 ...

  3. awk中文手册

    1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l        awk 适于解决哪些问题 ? l        awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模 ...

  4. 见过的最好AWK手册

    原文: http://linuxfire.com.cn/~lily/awk.html 简体中文版由bones7456 (http://li2z.cn)整理. 原文:应该是 http://phi.sin ...

  5. awk 手册

    1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l        awk 适于解决哪些问题 ? l        awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模 ...

  6. [转]awk使用手册

    awk 手册 简体中文版由bones7456 (bones7456@gmail.com)整理. 原文:应该是 http://phi.sinica.edu.tw/aspac/reports/94/940 ...

  7. awk手册

    awk 手册 简体中文版由bones7456 (bones7456@gmail.com)整理. 原文:应该是 http://phi.sinica.edu.tw/aspac/reports/94/940 ...

  8. Linux 递归修改后缀名

    1 修改命令 需要用到: find awk xargs 递归修改命令如下: find . -name '*.XXX' | awk -F "." '{print $2}' | xar ...

  9. 【译】 AWK教程指南 11递归程序

    awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束——该变量不论在function外或 func ...

随机推荐

  1. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)

    根据前序中序构建二叉树. 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0 1 2 3 4 5 6 先序遍历为: 6 3 7为了清晰表示,我给节点上了颜色,红色是 ...

  2. HashMap 实现原理

    深入Java集合学习系列:HashMap的实现原理   参考文献 引用文献:深入Java集合学习系列:HashMap的实现原理,大部分参考这篇博客,只对其中进行稍微修改 自己曾经写过的:Hashmap ...

  3. 全面解读Java NIO工作原理(4)

    全面解读Java NIO工作原理(4) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...

  4. 使用 JMeter 进行压力测试

    一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率:预估系统的承载能力,使我们能根据其做出一些应对措施.所以压力测 ...

  5. AngularJs 学习笔记(一)作用域

    AngularJs采用了注重时效的MVC方式,是基于MVW模式. 1.$scope和作用域的概念. AngularJs中的$scope对象是模板的域模型,也称作作用域实例,通过为其属性赋值,可以传递给 ...

  6. JDBC连接数据库时候出错

    错误提示如下: Fri May 13 09:06:04 CST 2016 WARN: Establishing SSL connection without server's identity ver ...

  7. 算法竞赛之递归——输出1-n的所有排列

    本文是博主原创文章,未经允许不得转载.我的csdn博客也同步发布了此文, 链接 https://blog.csdn.net/umbrellalalalala/article/details/79792 ...

  8. 通过Django Channels设计聊天机器人WEB框架

    这两个月都在忙着设计针对银联客服业务的智能聊天机器人,上一周已经交完设计报告,这一周还和部门同事一起分享了系统设计及运行效果.因为时间的关系,系统原型我使用了Flask+jQuery的组合,感觉用以原 ...

  9. oracle中通过sql查询sde中图形面积

    select st_area(shape) from XAG2011430200000M_DLTB t where objectid=330

  10. Hibernate二级缓存简述及基于Spring4,Hibernate5,Ehcache3的二级缓存配置

    Hibernate L2缓存 缓存的分类 L2缓存工作原理 放入二级缓存的数据 Ehcache 依赖 ehcache.xml 常用的memoryStoreEvictionPolicy(缓存算法) eh ...