Recursion 在SML中制作星形三角形

Recursion 在SML中制作星形三角形,recursion,sml,smlnj,Recursion,Sml,Smlnj,我刚开始用SMLNJ编码,在编写一个以三角形星形模式返回字符串的程序时遇到了一些麻烦。例如,三角形(5)应输出: ***** **** *** ** * 到目前为止,我的代码是: fun triangle(x) = if (x = 0) then "\n" else let fun makeTriangle(n) = if(n = 0) then "\n" else "*"^makeT

我刚开始用SMLNJ编码,在编写一个以三角形星形模式返回字符串的程序时遇到了一些麻烦。例如,三角形(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”。任何帮助都将不胜感激。

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

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

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))
解决办法是把所需的括号放进去

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


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

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

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

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))
解决办法是把所需的括号放进去

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


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

由于John已经解释了您的代码的一些问题,而且这似乎是一个练习,因此有两种不同的解决方法:

  • 递归地使用模式匹配:

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

    fun repeat (n, x) = List.tabulate (n, fn _ => x)
    
    但实际上,
    三角形
    本身在
    列表中非常适合

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

  • 由于John已经解释了代码中的一些问题,而且这似乎是一个练习,因此有两种不同的解决方法:

  • 递归地使用模式匹配:

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

    fun repeat (n, x) = List.tabulate (n, fn _ => x)
    
    但实际上,
    三角形
    本身在
    列表中非常适合

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