Рекурсивный метод определения, является ли строка шестнадцатеричным числом - Java - PullRequest
3 голосов
/ 15 апреля 2011

Это домашний вопрос, с которым у меня небольшие проблемы.

Напишите рекурсивный метод, который определяет, является ли строка шестнадцатеричным числом. Напишите javadocs для вашего метода. Строка - это шестнадцатеричное число, если каждый символ 0 или 1 или 2 или 3 или 4 или 5 или 6 или 7 или 8 или 9 или а или а или б или б или с или с или д или D или е или е или f или f.

На данный момент все, что я могу увидеть, чтобы проверить это, это если символ в 0 строки является одним из этих значений, которые он дал мне, то эта часть является шестнадцатеричным.

Любые советы или предложения, чтобы помочь мне?

Это то, что я имею до сих пор: `

public boolean isHex(String string){


    if (string.charAt(0)==//what goes here?){
        //call isHex again on s.substring(1)
    }else return false;
    }

`

Ответы [ 5 ]

5 голосов
/ 15 апреля 2011

Если вы ищете хороший метод шестнадцатеричных чисел:

boolean isHexDigit(char c) {
    return Character.isDigit(c) || (Character.toUpperCase(c) >= 'A' && Character.toUpperCase(c) <= 'F');
}

Подсказки или предложения в соответствии с запросом:

  1. Все рекурсивные методы вызывают себя с другим входом (ну, надеюсь, другой ввод!)
  2. Все рекурсивные методы имеют условие остановки.

Ваша сигнатура метода должна выглядеть примерно так

boolean isHexString(String s) {
    // base case here - an if condition

    // logic and recursion - a return value

}

Кроме того,не забывайте, что шестнадцатеричные строки могут начинаться с "0x".Это может быть (более) трудно сделать, поэтому я бы сначала включил обычную функцию.Если вы решите это позже, постарайтесь помнить, что 0xABCD0x123 не должен проходить.: -)

О подстроке: Прямо из источника класса String:

public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
    throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
    throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
    new String(offset + beginIndex, endIndex - beginIndex, value);
}

смещение является переменной-членом типа int

значение является переменной-членомвведите char[]

, и конструктор, который он вызывает, это

String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}

Это явно метод O (1), вызывающий конструктор O (1).Это может быть сделано, потому что String неизменен.Вы не можете изменить значение строки, только создать новую.(Давайте отбросим такие вещи, как рефлексия и sun.misc.unsafe, поскольку они являются посторонними решениями!) Поскольку это не может быть изменено, вам также не нужно беспокоиться о том, что какой-то другой поток будет с ним связываться, поэтому совершенно нормально обойтись какдеревенский велосипед.

4 голосов
/ 15 апреля 2011

Поскольку это домашняя работа, я даю только несколько подсказок вместо кода:

Напишите метод, который всегда проверяет первый символ строки, если он удовлетворяет требованиям.Если нет, верните false, если да, снова вызовите метод с той же самой String, но первый символ отсутствует.Если осталось только 1 символ и это также шестнадцатеричный символ, верните true.

Псевдокод:

public boolean isHex(String testString) {


   If String has 0 characters -> return true;

   Else

      If first character is a hex character -> call isHex with the remaining characters

      Else if the first character is not a hex character -> return false;

}
1 голос
/ 15 апреля 2011

При рекурсивном решении проблем обычно требуется решить небольшую часть («базовый случай»), а затем выполнить рекурсивный анализ для остальных.

Вы выяснили базовый случай - проверяете ли одинсимвол является шестнадцатеричным или нет.

Теперь вам нужно 'recurse on rest'.

Вот некоторый псевдокод (Python-ish) для обращения строки - надеюсь, вы увидите, как подобные методы могутбыть применены к вашей проблеме (действительно, все рекурсивные проблемы)

def ReverseString(str):
    # base case (simple)
    if len(str) <= 1:
        return str

    # recurse on the rest...
    return last_char(str) + ReverseString(all_but_last_char(str))
0 голосов
/ 16 апреля 2011

Вы уже получили много полезных ответов.Если вы хотите потренировать свои рекурсивные навыки (и навыки Java в целом) немного больше, я могу порекомендовать вам посетить Coding Bat .Вы найдете много упражнений вместе с автоматизированными тестами.

0 голосов
/ 15 апреля 2011

Похоже, что вы должны рекурсивно повторять символы в строке и возвращать логическое И того, находится ли текущий символ в [0-9A-Fa-f] с рекурсивным вызовом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...