2011-04-22 140 views
0

我有一个项目,我必须对凯撒密码进行编码,该密码需要一个字符串和一个移位量,然后将字符串加密为密文。我很容易在JavaScript中做到这一点,但现在我必须在F#中做到这一点。也没有循环只允许递归。我完全压力和困惑,没有时间,所以即使在这里张贴作为最后的手段。这是我到目前为止,我觉得我在一个完全错误的方向也得走......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

在这种情况下,它使得使用映射功能(在这种情况下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 

有可能是一个更好的解决方案(尤其是涵盖顺时针和反时针移),还在学习自己。

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) 

除此之外,它不是我清楚你的要求比别人来为你做所有工作的其他...

+0

这是正是我要求的。这是明天到期的,我用F#输了。 – rangers8905 2011-04-22 07:44:31

+0

和程序员抱怨教育比赛科学学院学生越来越... – Daniel 2011-04-22 14:37:33