【发布时间】:2020-11-19 02:36:59
【问题描述】:
编写一个函数,给出一个字母列表what和一个单词,如果单词可以使用列表中的字母拼写,则返回true,否则返回false。例如像
这样的列表['a';'b';'d';'e';'a']
还有这个词
bed
函数应该返回 true。
如果单词是bbed,它也应该返回false,因为列表中只有一个b。
这很容易通过在 for 循环中改变字典的状态来强制完成,但是如何在不改变的情况下以更实用的风格来做到这一点?
这是我做的命令式版本:
open System.Collections.Generic
let letters = new Dictionary<char,int>()
[ ('a', 2); ('b', 1); ('c', 1); ('e', 1) ] |> Seq.iter letters.Add
let can_spell (word : string) =
let mutable result = true
for x in word do
if letters.ContainsKey x && letters.[x] > 0 then
let old = letters.[x]
letters.[x] <- old - 1
else
result <- false
done
result
【问题讨论】:
-
这很简单。每次需要重新分配时,不要使用可变变量调用函数。如果您事先不知道函数调用的数量,请使用递归。