awk的递归
版权申明:本文为博主窗户(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的递归的更多相关文章
- 用awk写递归
看到自己很多年前写的一篇帖子,觉得有些意义,转录过来,稍加修改. awk是一种脚本语言,语法接近C语言,我比较喜欢用,gawk甚至可以支持tcp/ip,用起来非常方便. awk也支持递归,只是awk不 ...
- awk 手册--【转载】
1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l awk 适于解决哪些问题 ? l awk 常见的解题模式为何 ? 为使读者快速掌握awk解 ...
- awk中文手册
1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l awk 适于解决哪些问题 ? l awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模 ...
- 见过的最好AWK手册
原文: http://linuxfire.com.cn/~lily/awk.html 简体中文版由bones7456 (http://li2z.cn)整理. 原文:应该是 http://phi.sin ...
- awk 手册
1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l awk 适于解决哪些问题 ? l awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模 ...
- [转]awk使用手册
awk 手册 简体中文版由bones7456 (bones7456@gmail.com)整理. 原文:应该是 http://phi.sinica.edu.tw/aspac/reports/94/940 ...
- awk手册
awk 手册 简体中文版由bones7456 (bones7456@gmail.com)整理. 原文:应该是 http://phi.sinica.edu.tw/aspac/reports/94/940 ...
- Linux 递归修改后缀名
1 修改命令 需要用到: find awk xargs 递归修改命令如下: find . -name '*.XXX' | awk -F "." '{print $2}' | xar ...
- 【译】 AWK教程指南 11递归程序
awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束——该变量不论在function外或 func ...
随机推荐
- MVC3 项目总结
验证 Validation 多样化验证规则 http://www.cnblogs.com/xling/archive/2012/07/11/2587002.html 最常见的验证方式是:在实体的属性上 ...
- IOS Swift语言开发 tableView的重用以及自cell的自适应高度
http://www.aichengxu.com/iOS/11143168.htm 一.准备数据 (这是一个元组,第一个元素为英雄的名字;第二个元素为英雄头像图片的名字,格式为.PNG,如果为其他的格 ...
- 实验6 shell程序设计一(1)
设计如下一个菜单驱动程序 Use one of the following options: P:To display current directory S:To display the name ...
- Nodejs http-proxy代理实战应用
var https = require('https'); var express = require('express'); var app = express() var http = requi ...
- [INet] WebSocket 协议中的数据收发过程
WebSocket 和 HTTP 相似,只是一个应用层协议,对下层透明,所以不涉及 TCP/IP. 由于浏览器支持了 WebSocket,所以在用 JS 写客户端的时候,是无需考虑数据的编码解码的. ...
- 算法训练 2的次幂表示(蓝桥杯C++写法)
问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...
- 解决0% [Waiting for headers] 导致的unable to lock the administration directory (/var/lib/dpkg/) is another process using it
这是我在配置vim的YouCompleteMe时遇到的问题,我需要使用CMake来编译YCM. 在我输入 $ sudo apt install cmake 由于网络原因导致安装一直卡在0% [Wait ...
- 【转】java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- LESS的简单介绍
对于一些布局和样式比较复杂的网页,如何构建一个健康.优雅的CSS文件是一个很令人苦恼的问题.在书写静态页面的时候,我总是遇到布局结构累赘和重复样式复用性不高的问题,当然,对于这些问题归根究底还是要多联 ...
- vue config.js配置生产环境和发布环境不同的接口地址问题
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...