Recursion 在SML中制作星形三角形
我刚开始用SMLNJ编码,在编写一个以三角形星形模式返回字符串的程序时遇到了一些麻烦。例如,三角形(5)应输出: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
*****
****
***
**
*
到目前为止,我的代码是:
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"))