Программы для печати рисунков обратного треугольника с * в scala - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь исследовать Скалу. Я новичок в Скале. Это может быть простой вопрос и поиск в Google, чтобы получить сценарий ниже, чтобы решить. Но не смог получить ответы. Вместо Scala я получаю связанные с Java вещи. Мое требование распечатать формат, как показано ниже.

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

Может кто-нибудь предложить мне, как получить этот формат.

Заранее спасибо.

Канти

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Чтобы добавить альтернативу ответу Луиса, вот рекурсивное решение:

import scala.annotation.tailrec

def printStars(i: Int): Unit = {
  @tailrec
  def loop(j: Int): Unit = {
    if(j > 0) {
      val stars = Range(0, j).map(_ => "*").mkString(" ") // make stars
      if(i == j) println(stars)                           // no need for spaces
      else println((" " * (i - j)) + stars)               // spaces before the stars
      loop(j - 1)
    }
  }
  loop(i)
}

printStars(3)
// * * *
//  * *
//   *

Эта функция будет принимать максимальный размер треугольника (i), и для этого размера, пока i больше не будетбольше 0 выводит правильное количество звездочек (и пробелов), затем уменьшается на 1.

Примечание: Range(0, j).map(_ => "*").mkString(" ") можно заменить на List.tabulate(j)(_ => "*").mkString(" ") в ответе Луиса - я не уверен, какиебыстрее (я не проверял).

1 голос
/ 07 октября 2019

Просто для иллюстрации приведем два возможных решения проблемы.
Первый полностью императив , а второй более функциональный .

Идея состоит в том, что это служит примером, который поможет вам думать, как решать проблемы программным способом.
Как многие из нас уже прокомментировали, если вы не понимаете основных идей, лежащих в основе решения,тогда этот код будет бесполезен в долгосрочной перспективе.

Вот императивное решение, идея проста, нам нужно напечатать n строк, каждая строка содержит n - i начинается (где i - номер строки, начинающийся с 0) . Старты разделены пустым пробелом.
Наконец, перед печатью стартов нам понадобятся некоторые отступы. Из примеров входных данных видно, что отступ начинается с 0 и увеличивается на 1 для каждой строки.

def printReverseTriangle(n: Int): Unit = {
  var i = 0
  var padding = 0
  while (i < n) {
    var j = padding
    while (j > 0) {
      print(" ")
      j -= 1
    }

    var k = n - i
    while (k > 0) {
      print("* ")
      k -= 1
    }

    println()
    i += 1
    padding += 1
  }
}

А вот и более функциональный подход.
Как видите, в этом случае нам не нужно ничего менять, все операторы высокого уровня делают это за нас. И нам нужно только сосредоточиться на описании решения.

def printReverseTriangle(size: Int): Unit = {
  def makeReverseTriangle(size: Int): List[String] =
    List.tabulate(size) { i =>
      (" " * (size - i)) + ("* " * i)
    }.reverse

  println(makeReverseTriangle(size).mkString("\n"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...