函数的递归定义选择k xs

时间:2018-04-06 16:50:33

标签: haskell functional-programming

我试图解决"函数式编程简介中发现的以下问题"第一版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

1 个答案:

答案 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)
相关问题