В этом случае имеет больше смысла использовать функцию отображения (в данном случае 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
Возможно, существует гораздо более элегантное решение (особенно для охвата как сдвига по часовой стрелке, так и по часовой стрелке), все еще изучающее себя.