Преобразование циклов в рекурсивное решение - PullRequest
1 голос
/ 01 марта 2020

Я написал метод pythagoreanTriplets в scala, используя вложенные циклы. Как новичок ie в scala, я борюсь с тем, как мы можем сделать то же самое, используя рекурсию и используя Lazy Evaluation для возвращающегося списка (Список кортежей). Любая помощь будет высоко оценена.

PS: следующий метод работает отлично.

// This method returns the list of all pythagorean triples whose components are
// at most a given limit. Formula a^2 + b^2 = c^2

def pythagoreanTriplets(limit: Int): List[(Int, Int, Int)] = {
    // triplet: a^2 + b^2 = c^2
    var (a,b,c,m) = (0,0,0,2)
    var triplets:List[(Int, Int, Int)] = List()
    while (c < limit) {
      breakable {
        for (n <- 1 until m) {
          a = m * m - n * n
          b = 2 * m * n
          c = m * m + n * n
          if (c > limit)
            break
          triplets = triplets :+ (a, b, c)
        }
        m += 1
      }
    }// end of while
    triplets
  }

1 Ответ

4 голосов
/ 01 марта 2020

Я не понимаю, где рекурсия дала бы существенные преимущества.

def pythagoreanTriplets(limit: Int): List[(Int, Int, Int)] = 
  for {
    m <- (2 to limit/2).toList
    n <- 1 until m
    c =  m*m + n*n if c <= limit
  } yield (m*m - n*n, 2*m*n, c)
...