lua程序设计 第一章习题答案
练习1.1:运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题。
答:当输入负数时,循环无法终止,因为原本程序中的终止条件为n==0,而在输入为负数情况下,无法达成此终止条件。
程序在输入为负数时会失效,在输入为0和整数以外的其他数时都会失效,因为每次迭代将值减少1;在其他情况下,无法出现恰好==0的终止条件,从而导致堆栈溢出。
解决办法有两个思路:1.在调用方进行约束;2.在被调用方进行约束。
为函数本身简单起见,函数中终止条件修改为<=0,调用方负责传入的数值为非负整数。最后得到的代码如下:
--定义一个计算阶乘的函数 function fact(n) if n<=0 then return 1; else return n*fact(n-1); end end print("enter a number:"); a= io.input():read("n");--读取一个数字 print(fact(math.max(0,math.floor(a))));
练习1.2:分别使用-l参数和dofile运行twice示例,并感受你喜欢哪种方式。
--方式1: -l
--重要提示:必须在lua解释器之外运行,例如cmd环境中,否则会报错,无法执行。
lua -llib1
--或者
lua -l lib1
--重要:千万不要输入.lua后缀,否则会报错,无法执行。
--这样载入库之后就可以在lua 交互环境中使用twice了
--方式2: dofile
--重要提示:指令必须由lua解释器来执行,在cmd环境中执行。
dofile "lib1.lua"--引号不可省略,.lua不可省略
--【【
两者的区别:
1.前者载入的库,后者读取的是文件。后缀不同,对象有形式上的区别。
2.使用环境不同:前者在解释器之外;后者在解释器环境之内。
由于调试中通常处于解释器环境,可能后者用得更多。如书中所言,一边在解释器中dofile,一边在编辑器中编辑,这样操作,比较爽利。
--】】
练习1.3:你是否能够举出其他使用“--”作为注释的语言?
答:不知道。
练习1.4:以下字符串中哪些是有效的标识符?
___, _end,End,end,until?,nil,NULL,one-step
答:one-step中有非法字符"-",NULL,nil,end都是关键字;until?中有非法字符”?“,前面三个都是有效的标识符。
练习1.5:表达式type(nil)==nil的值是什么?你可以直接在Lua中运行来得到答案,但是你能够解释原因吗?
答:值为false,因为type的返回值为字符串,与nil的类型不同,所以不可能相等,所以值为false.
练习1.6:除了使用函数type外,如何检查一个值是否为Boolean类型?
答:假设检查形式为是Boolean类型就返回true,否则返回false.
function isBoolean( value ) -- body return (value==true or value==false); end
练习1.7:考虑如下的表达式:
(x and y and (not z)) or ((not y) and x)
其中的括号是否是必须的?你是否推荐在这个表达式中使用括号?
答:not的优先级最高,因此,not的括号首先不是必须的;and优先度高于or;由此可见,从语义角度,括号没有必要;但为了清晰起见,在这个表达式中应当使用括号。
练习1.8:请编写一个可以打印出脚本自身名称的程序(事先不知道脚本自身的名称)。
答:第11提到,有一个全局的变量arg,可以用来获取解释器传入的参数。其中arg【0】保存的内容为脚本名称。因此,可以如下书写:

进一步,如果考虑去除路径,可以继续优化函数。