Создание звездного треугольника в SML - PullRequest
0 голосов
/ 23 сентября 2018

Я только начал писать код в 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».Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Поскольку Джон уже объяснил некоторые проблемы с вашим кодом, и поскольку это кажется упражнением, есть два способа решить его по-разному:

  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"))
    
0 голосов
/ 24 сентября 2018

Существует как минимум две проблемы с вашим кодом:

Во-первых, существует простая проблема с приоритетом оператора:

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).

...