我有一个项目,我必须编写一个Caesar密码,它接受一个字符串和一个移位量,然后将字符串加密成密文。我很容易在JavaScript中做到这一点,但现在我必须在F#中做到这一点。也没有循环只允许递归。我完全感到压力和困惑,时间不多了所以我作为最后的手段在这里张贴。这就是我到目前为止所做的一切,我觉得我正朝着一个完全错误的方向前进......
let rec encrypt str shiftAmount =
if str.length > 0 then
strChar = str.ToUpper().Chars(0)
strUni = int strChar
strCoded = (((strUni + shiftAmount - 65) %26) +65)
else
答案 0 :(得分:0)
在这种情况下,使用映射函数(在本例中为Array.Map()
)和流水线而不是递归更有意义,因为您必须将函数(字符移位)应用于字符串中的每个字符。下面应该适用于大写字符:
let shift(c, shiftAmount) =
let num = int(c) - int('A')
let offsetNum = (num+shiftAmount)%26
let result = offsetNum + int('A')
if offsetNum < 0 then
char(int('Z') + offsetNum + 1)
else
char(offsetNum + int('A'))
let encrypt(str:string, shiftAmount) =
str.ToCharArray()
|> Array.map (fun c -> shift( int(c), shiftAmount))
|> String.Concat
可能有一个更优雅的解决方案(特别是涵盖时钟和逆时针转换),仍在学习自己。
答案 1 :(得分:0)
这是一个天真的凯撒编码:
let encode (str:string) shift =
let inline flipzip a b = b, a
str
|> String.map (fun ch ->
ch
|> int
|> flipzip (int 'A')
||> (-)
|> (+) shift
|> flipzip 26
||> (%)
|> (+) (int 'A')
|> char)
除此之外,我不清楚除了别人为你做的所有工作之外你要求的是什么......