Я пытаюсь написать рекурсивную функцию, которая возвращает List , но у меня возникли некоторые проблемы с синтаксисом.
Функция должна возвращать пустой список по окончании рекурсиив противном случае кортеж (int * int) объединяется со списком, возвращаемым рекурсивным вызовом самому себе:
let rec foobar () : List<int * int> =
if (recursionIsEnded) then
[]
else
foobar () :: (10, 10) // this is wrong
// (10,10) works, but I need to concatenate it with the elements returned by foobar recursive call
Может ли кто-нибудь объяснить мне, что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Я постараюсь дать более подробную информацию.На самом деле моя функция немного сложнее.Я перебираю 2d массив и строю список кортежей с элементами индекса массива, которые удовлетворяют определенному условию.На самом деле это мой код:
let rec GetSameColorNeighs(grid : Option<Ball> [,], row : int , col : int, color : Microsoft.Xna.Framework.Color) : List<int * int> =
if (row < 0 || col < 0 || row > MaxLineNumber - 1 || col > BallsPerLine - 1) then
[]
else
let ball = grid.[row,col]
match ball with
|Some(ball) ->
if (!ball.visited = false || not <| ball.color.Equals(color)) then
[row , col]
else
ball.visited := true
(row,col) ::GetSameColorNeighs(grid, row + 1, col + 1, color) :: GetSameColorNeighs(grid, row - 1, col - 1, color)
|None -> []
Итак, вот еще 2 вопроса:):
Как изменить следующую строку, чтобы она компилировалась?
(row,col) ::GetSameColorNeighs(grid, row + 1, col + 1, color) :: GetSameColorNeighs(grid, row - 1, col - 1, color)
Есть ли лучший способ сделать это?
Меня не волнует порядок элементов списка.