作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个返回 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
有人可以向我解释我做错了什么吗?
编辑:
我会尽力提供更多细节。其实我的功能有点复杂。我正在遍历一个二维数组,并用满足特定条件的数组索引元素构建一个元组列表。实际上这是我的代码:
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)
有更好的方法吗?
我不关心列表的元素顺序。
最佳答案
Daniel 的解决方案在我看来不错,但您不需要使用可变状态 (ResizeArray
)。相反,您可以将 loop
函数编写为使用 yield
生成结果并使用 yield!
进行递归调用的序列表达式:
let GetSameColorNeighs (grid:Option<Ball>[,], row, col, color:Color) =
let rec loop (row, col) = seq {
if not (row < 0 || col < 0 || row > MaxLineNumber - 1
|| col > BallsPerLine - 1) then
let ball = grid.[row,col]
match ball with
| Some(ball) ->
if (!ball.visited = false || not <| ball.color.Equals(color)) then
// Not sure what you want here - yield items using 'yield'?
// [row , col]
else
ball.visited := true
yield row, col // Add single item to results
yield! loop(row + 1, col + 1) // Add all generated to results
yield! loop(row - 1, col - 1) // -- || --
| None -> () }
loop(row, col) |> Seq.toList
关于list - F# : Writing a function that builds a list of tuples recursively, 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423571/
我是一名优秀的程序员,十分优秀!