2013-11-23 3 views
0

Мне нужно написать метод, который вернет содержимое определенной строки (индекс его вводится как параметр метода). У меня нет большого опыта в Scala, и поэтому я смущаюсь. Я хотел бы сделать что-то вроде для цикла от 1 до 9, если строка не пуста возвращаемое значение, однако, я должен использовать рекурсию и никаких петель и я также дал этот метод определения:Рекурсия Scala решает судоку

def r(r: Int): Set[Int] = { 
    //code 
    } 

Я также не знаете, как работает Set. Любая помощь могла бы быть полезна. PS: Я не прошу полного кода, алгоритма объяснения было бы более чем достаточно!

+2

Почему вы ** есть ** использовать рекурсию с ** ** данного метода подпись? Может быть, это школьный проект? – Bart

+1

Googling для * алгоритма sudoku * дал мне это как лучший результат. http://en.wikipedia.org/wiki/Sudoku_solving_algorithms – Bart

ответ

0

Я не совсем понимаю вопрос. Я имею в виду, что я понимаю, что вам нужно использовать рекурсию, а не циклы (и это довольно просто), но я не понимаю, что вы ожидаете от этой сигнатуры метода. например

  • Почему он возвращает набор?
  • Что означает этот параметр?
  • Что еще можно использовать для решения проблемы?

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

Я написал и опубликовал решение Scala Sudoku, которое использует много рекурсии, но это не поможет вам здесь, если вы не изучите некоторые основы.

0

Функциональное программирование сильно отличается от императивного программирования, которое большинство людей начинают с того, когда изучают программирование. Если это ваш первый функциональный язык, я предлагаю пройти курс следующим образом: https://www.coursera.org/course/progfun. Это использует Scala для обучения основам базового языка и может помочь вам.

Невозможно использовать циклы не всегда означает, что вы должны реализовать рекурсивную функцию. Существуют стандартные функциональные конструкции, такие как map, filter и т. Д., Которые вы можете использовать.

PS: Решатель sudoku - это то, что я пытался сделать, когда начинал изучать Scala. Вот код, если вы хотите посмотреть: https://github.com/saileshmittal/Scadoku.

0

Здесь Судоку решатель, используя неизменные структуры данных:

val n = 9 
val s = Math.sqrt(n).toInt 
type Board = IndexedSeq[IndexedSeq[Int]] 

def solve(board: Board, cell: Int = 0): Option[Board] = (cell%n, cell/n) match { 
    case (r, `n`) => Some(board) 
    case (r, c) if board(r)(c) > 0 => solve(board, cell + 1) 
    case (r, c) => 
    def cells(i: Int) = Seq(board(r)(i), board(i)(c), board(s*(r/s) + i/s)(s*(c/s) + i%s)) 

    def guess(x: Int) = solve(board.updated(r, board(r).updated(c, x)), cell + 1) 

    1 to n diff (board.indices flatMap cells) collectFirst Function.unlift(guess) 
} 

Вот полное использование: https://gist.github.com/pathikrit/a32e17832296befd6b94

+0

Что означает значение на 'board (s * (r/s) + i/s) (s * (c/s) + i% s)'? – Khanetor

+0

i-я ячейка в поле 3x3, содержащая (r, c). – pathikrit

+0

Получил! Благодаря! – Khanetor

Смежные вопросы