2011-04-22 136 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