这里有一些建议。
遵循此递归方案可以找到一种效率低但可行的解决方案。
search :: String -> Char -> [Int]
search [] letter = ???
search (x:xs) letter = doSomethingWith (search xs letter)
where doSomethingWith :: [Int] -> [Int]
doSomethingWith ns = ???
想想如何将递归调用的结果转化为实际结果。例如:
search "abcb" 'b' = doSomethingWith (search "bcb" 'b')
= doSomethingWith [0,2]
should be
[1,3]
search "bbcb" 'b' = doSomethingWith (search "bcb" 'b')
= doSomethingWith [0,2]
should be
[0,1,3]
注意doSomethingWith中可以引用x,检查是否等于letter。
为了更好的解决方案,请尝试添加一个额外的参数,以便传递当前位置的索引。例如:
search :: String -> Char -> [Int]
search str letter = searchWorker str letter 0 -- initial position is 0
searchWorker :: String -> Char -> Int -> [Int]
searchWorker [] letter position = ???
searchWorker (x:xs) letter position =
-- increment position at every recursive call
doSomethingWith (searchWorker xs letter (position+1))
where doSomethingWith :: [Int] -> [Int]
doSomethingWith ns = ???
这简化了doSomethingWith 的编码,因为现在可以假定递归调用产生正确的索引。
searchWorker "abcb" 'b' 0
= doSomethingWith (searchWorker "bcb" 'b' 1)
= doSomethingWith [1,3]
should be
[1,3]
searchWorker "bbcb" 'b' 0
= doSomethingWith (searchWorker "bcb" 'b' 1)
= doSomethingWith [1,3]
should be
[0,1,3]