我试图解决"函数式编程简介中发现的以下问题"第一版Bird-Wadler。
5 .6.2函数选择k xs返回xs的所有子序列的列表 长度恰好是k。例如: ?选择3"列表" [" IST" ," lst" ,"点燃" ," lis"] 给出一个递归的选择定义。如果xs的长度为n,则显示出来 选择k xs的长度为nk
我只能提出一个基于函数的非递归解决方案,该函数返回数组的子集列表:
subs :: [a] -> [[a]]
subs [] = [[]]
subs (x:xs) = subs xs ++ map (x:) (subs xs)
choose :: Int -> [a] -> [[a]]
choose x = filter ((== x) . length) . subs
答案 0 :(得分:4)
我想你在问:
这个问题的唯一递归函数解决方案是什么?
如果您仔细地仔细阅读基础和递归案例,通常可以解决这些问题。例如:
选择是从int的函数和值列表到值列表的列表:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
cell.textLabel?.text = "\(data[indexPath.row])"
return cell
}
如果结果假定为0长度,则只有一个所述长度的子列表:
choose :: Int -> [a] -> [[a]]
如果结果非零,但我们没有更多的字符用于制作子列表,那么就没有解决方案:
choose 0 _ = [ [] ]
否则我们可以取第一个字符并将其附加到长度为1的所有解决方案中:
choose _ [] = []
或者我们丢弃这个字符(例如,删除'l'并获得结果“ist”)并寻找带有子字符串的解决方案:
choose n (x : xs) =
map (x :) (choose (n - 1) xs)