当前位置: 首页 > news >正文

12 函数的应用

函数的应用

一、Shell递归函数

​ 函数优点:

​ 函数在程序设计中是一个非常重要的概念,它可以将程序划分成一个个功能相对独立的代码块,使代码的模块化更好,结构更加清晰,并可以有效地减少程序的代码量。

​ 递归函数:

​ 如果一个函数在内部调用自身本身,这个函数就是递归函数。有很多数学问题都非常适合于采用递归的思想来设计程序求解,例如阶乘、汉诺(hano)塔等。

​ 很多人都曾经听说过fork 炸弹,它实际上只是一个非常简单的递归程序,程序所做的事情只有一样:不断fork 一个新进程。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源

一)fork 炸弹

​ 在bash 中设计这样一个fork 炸弹非常简单:

.(){ .|.& };. 这就是fork炸弹的代码

​ fork炸弹的解释:

​ .():说明下面要定义一个函数,函数名为小数点,函数没有参数

​ {:表示函数体开始

​ .|.& :函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行

​ }:函数体结束

​ ;:不会执行什么操作,在命令行中用来分隔两个命令用

​ .:调用本函数

二)阶乘案例

​ 我们来计算阶乘n! = 1 x 2 x 3 x … x n,用函数fact(n)表示,可以看出:

​ fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n

​ 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。

#!/bin/bashfunction fact(){if [ $1 -eq 1 ];thenreturn 1elsefact `expr $1 -1`reutrn `expr $1 \* $?`fi
}echo -n "请输入:"
read num
fact $numecho $?

二、Shell中脚本变量和函数变量的作用域

​ 在shell中定义函数可以使代码模块化,便于复用代码,不过脚本本身的变量和函数的变量的作用域问题可能令你费解

​ Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止,代码演示如下

​ 脚本变量v的作用域从被定义的地方开始,到shell结束。调用函数func的地方在变量v的作用域内,所以能够访问并修改变量v

#!/bin/bash
func()
{echo $v#修改v的值v=200
}
#定义v的值
v=100
#调用func方法
func
#打印v值
echo $v

​ Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的

​ 结果解释:函数变量v默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束为止。注意,不是从定义函数的地方开始,而是从调用函数的地方开始。打印命令在变量v的作用域内,所以能够访问变量v

#!/bin/bash
func()
{v=200
}
fun
cecho $v# 结果:200

​ 结果解释:函数变量v显示定义为local的,其作用域局限于函数内。打印命令在函数外,不在变量v的作用域内,所以不能访问变量v

#!/bin/bash
func()
{local v=200
}
func
echo $v#结果:空

​ 函数参数是local的,通过位置变量来访问。打印命令输出函数的第一个参数

#!/bin/bash
func()
{echo "param 1: $1"
}
func 100# 结果:param 1:200

​ 如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量

#!/bin/bash
func()
{echo $vlocal v=200echo $v
}
v=100
func
echo $v# 结果:100、200、100
http://www.lryc.cn/news/448097.html

相关文章:

  • 鸿蒙开发(NEXT/API 12)【硬件(接入手写套件)】手写功能开发
  • 基于python+flask+mysql的音频信息隐藏系统
  • 18724 二叉树的遍历运算
  • 代理模式简介:静态代理VS与动态代理
  • 使用 Dockerfile 和启动脚本注册 XXL-Job 执行器的正确 IP 地址
  • Python连接Kafka收发数据等操作
  • MySql在更新操作时引入“两阶段提交”的必要性
  • 充气模块方案——无刷充气泵pcba方案
  • [sql-03] 求阅读至少两章的人数
  • Linux如何通过链接下载文件
  • seL4 IPC(五)
  • 【Java】多线程基础操作
  • 基于Hive和Hadoop的病例分析系统
  • 数据结构编程实践20讲(Python版)—03栈
  • 【注册/登录安全分析报告:孔夫子旧书网】
  • PMP--二模--解题--141-150
  • 我的领域-关怀三次元成长的二次元虚拟陪伴 | OPENAIGC开发者大赛高校组AI创作力奖
  • 个人账号(学校+个人)申请专利过程中遇见的问题
  • 在ubuntu系统中,如何让其按下物理关机键时,系统不处理,但qt程序能检测到关机键按下的事件,并处理信号
  • 先进制造aps专题二十六 基于强化学习的人工智能ai生产排程aps模型简介
  • 各领域/行业硬件一览表
  • 机器学习-SVM
  • 翻译器在线翻译:开启多语言交流新时代
  • 网络编程(10)——json序列化
  • 基于FreeRTOS的STM32多功能手表设计
  • 18.Linux-配置DNF仓库
  • GeoPB:高效处理地理空间数据的Protobuf解决方案
  • 华为仓颉语言入门(6):if条件表达式
  • openlayers中一些问题的解决方案
  • java通过redis完成幂等性操作