• absinthe691

    @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))
    
    absinthe691发表于 2025/11/7 19:54:45
  • 761317247

    博主,问第一节 阶乘输入负数直接 提示一大串代码 所依答案怎么写

    761317247发表于 2022/7/14 18:15:52
    • ljf7

      重新写条件语句和分状态对待。其实也可以用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发表于 2023/2/24 9:44:15
    • absinthe691

      @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))
      ```

      absinthe691发表于 2025/11/7 19:45:07
  • SteveLiu

    第116页第一个例子,最后一行输出应该为
    Lua is great, isn't it? 2
    书本上少了一个2

    SteveLiu发表于 2021/9/12 13:40:15
  • WoodsGao

    81页12行有误
    if op == "+" the应为if open == "+" then

    WoodsGao发表于 2020/9/10 18:51:23
  • planck

    继续纠错二:28.5示例中,参数个数narg在28.6没看到累加

    planck发表于 2020/8/22 15:38:06
    • 符隆美

      感谢提示,我们和译者确认一下。

      符隆美发表于 2020/8/28 10:46:06
  • 1
  • 2