@761317247 阶乘计算按照原来的想法就是使用函数递归, 但输入负数意味着, 按照原来的条件, 递归 n * fact(n - 1) 会导致负数变得越来小, 也就是往负无穷的方向跑. 但我们想要他往 o 跑结束这个递归, 从而考虑 n * fact(n + 1) 即可: 于是可以进行如下优化:
-- 修正阶乘函数的定义
function fact(n)
if n == 0 then
return 1
elseif n < 0 then
return n * fact(n + 1)
else
return n * fact(n - 1)
end
end
print("enter a number:")
a = io.read("*n")
print(fact(a))
在 书中1.4.2 节提到 (a and b or c) (b 不是 boolean 类型的 false ) 等价与 C 语言的 (a ? b : c) 于是可以:
local function fact(n)
if n == 0 then
return 1
else
return (n > 0 and (n * fact(n - 1)) or (n * fact(n + 1)))
end
end
print("enter a number:")
a = io.read("*n")
print(fact(a))
甚至可以:(虽然降低了可读性)
local function fact(n)
return (n == 0 and 1 or (n > 0 and (n * fact(n - 1)) or (n * fact(n + 1))) )
end
print("enter a number:")
a = io.read("*n")
print(fact(a))
重新写条件语句和分状态对待。其实也可以用elisp来重写:
(defun factorial (n)
(if (zerop n)
1
(* n (factorial (1- n)))))
不过无法处理负数。
我用lua这样写:
function fact (n)
if n== 0 then
return 1
elseif n < 0
return n * fact ( - n -1)
else
return n * fact ( n -1 )
end
end
print(fact( -3))
output: -6
-6
因此我觉得可以针对这个数是>0 还是 < 0 写 两个相似的func,在 n < 0 只需要在 fact ( - n -1)就可以了。
Good luck to you.
愿世界“傻人傻劲”再多一些.
@ljf7 您的代码 缺少了一个 then
```lua
function fact (n)
if n== 0 then
return 1
elseif n < 0 then
return n * fact ( -n-1)
else
return n * fact ( n -1 )
end
end
print(fact( -3))
```
@761317247
阶乘计算按照原来的想法就是使用函数递归, 但输入负数意味着, 按照原来的条件, 递归
n * fact(n - 1)会导致负数变得越来小, 也就是往负无穷的方向跑. 但我们想要他往o跑结束这个递归, 从而考虑n * fact(n + 1)即可:于是可以进行如下优化:
在 书中
1.4.2节提到(a and b or c)(b不是boolean类型的false) 等价与C语言的(a ? b : c)于是可以:甚至可以:(虽然降低了可读性)
博主,问第一节 阶乘输入负数直接 提示一大串代码 所依答案怎么写
第116页第一个例子,最后一行输出应该为
Lua is great, isn't it? 2书本上少了一个2
81页12行有误
if op == "+" the应为if open == "+" then继续纠错二:28.5示例中,参数个数narg在28.6没看到累加