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】保存的内容为脚本名称。因此,可以如下书写:  

function getScriptName()
    return arg[0]
end
测试如下:

 

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

 

 

 
posted @ 2019-12-11 22:24  逝去的帆  阅读(790)  评论(0)    收藏  举报