2015-05-15 3 views
0

Итак, я пытаюсь придумать способ шифрования/расшифровки цезарного шифра (где вы берете значение, а затем сдвигаете буквы, которые много раз вдоль алфавита, например, если ключ был 3, тогда a станет d, b будет e, а c будет f и т. Д.), Но мне нужно использовать рекурсию, а не итерацию. Вот что я до сих пор, но это только шифрование самого последнего символа и вывод «Шифрован - w», что для меня не имеет смысла.Цезарный шифр на Java с рекурсией?

public class Driver { 

static String encrypted = ""; 

public static void main(String[] args) { 

    System.out.println("Encrypted - " + cipher("encrypt", 3)); 

} 

public static String cipher(String str, int i){ 
    char ch = str.charAt(0); 
    StringBuffer output = new StringBuffer(); 
    if (str.length() <= 1) { 
      ch = (char) ('a' + (ch - 'a' + i) %26); 
      output.append(ch); 
      return output.toString(); 
    } 
    else{ 
     return cipher(str.substring(1),i); 

    } 


} 

} 
+0

Вы возвращаете только зашифрованный «хвост» в своем другом. Нужно объединить его с головой. – Thilo

+0

Спасибо! Я так и думал ... но что ты имеешь в виду под голову? Как я могу это изменить? – Sarah

+0

'return cipher (str.substring (1), i);' Это возвращает только конец строки. Вам нужно подумать о том, как объединить это с неполной частью, чтобы получить всю строку. – Thilo

ответ

1

Эй, в этой логике вы делаете шифрование только для последней буквы. Вы должны сделать это для всех писем. и, как @Thilo справедливо сказал, что вы должны заботиться о голове также. Рабочее решение будет таким:

public static String cipher(String str, int i) { 
    char ch = str.charAt(0); 
    StringBuffer output = new StringBuffer(); 
    ch = (char) ('a' + (ch - 'a' + i) % 26); 
    output.append(ch); 

    if (str.length() > 1) { 
     output.append(cipher(str.substring(1), i)); 
    } 

    return output.toString(); 
} 
Смежные вопросы