【问题标题】:Making a Star Triangle in SML在 SML 中制作星形三角形
【发布时间】:2019-02-27 10:09:07
【问题描述】:

我刚刚开始在 SMLNJ 中编码,并且在编写一个以三角形星形模式返回字符串的程序时遇到了一些麻烦。例如 triangle(5) 应该输出:

*****
****
***
**
*

到目前为止我的代码是:

fun triangle(x) =  
    if (x = 0) then "\n"  
    else   
        let  
            fun makeTriangle(n) =  
                if(n = 0) then "\n" else "*"^makeTriangle(n-1);  
        in  
            makeTriangle(x);  
        end  
        triangle(x-1)  

我收到错误“triangle.sml:9.3 错误:语法错误:插入 EQUALOP”。任何帮助将不胜感激。

【问题讨论】:

    标签: recursion sml smlnj


    【解决方案1】:

    您的代码至少有两个问题:

    首先,有一个简单的运算符优先级问题:

    if(n = 0) then "\n" else "*"^makeTriangle(n-1)
    

    解析为

    (if(n = 0) then "\n" else "*") ^ makeTriangle(n-1)
    

    而不是你的预期

    if(n = 0) then "\n" else ("*" ^ makeTriangle(n-1))
    

    解决方案是放入所需的括号。

    另一个问题是函数底部的杂散线triangle(x-1)。它与上面的代码无关。如果您打算将其连接到函数调用 makeTriangle(x) 的结果,那么您需要进行显式连接。 end 之后的函数定义中确实不应该有任何内容,因为 end 终止了 else 部分。

    一个小问题:由于您的函数 makeTriangle 插入了 "\n",因此您的代码(修复后)将在三角形底部有 两个 "\n"。如果这不是您想要的,也许您可​​以考虑基本案例 (n=0)。

    【讨论】:

      【解决方案2】:

      由于 John 已经解释了您的代码的一些问题,并且这看起来像是一个练习,因此您可以通过两种不同的方式来解决它:

      1. 递归,使用模式匹配:

        fun repeat (0, _) = []
          | repeat (n, x) = x :: repeat (n-1, x)
        
        fun triangle 0 = ""
          | triangle n = implode (repeat (n, #"*")) ^ "\n" ^ triangle (n-1)
        
      2. 有一个名为List.tabulate 的库函数,其中repeat 是一个特例:

        fun repeat (n, x) = List.tabulate (n, fn _ => x)
        

        但实际上,triangle 本身非常适合 List.tabulate

        fun triangle n =
            concat (List.tabulate (n, fn i => implode (repeat (15 - i, #"*")) ^ "\n"))
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多