2016-02-18 7 views
0

ниже кода используется закрытый метод для добавления в счетчик переменных. Ниже этой переменной есть условные выражения, которые, по моему мнению, не будут выполняться до тех пор, пока стек рекурсии не будет отслеживать восходящее слово. Я прав? Мой тест терпит неудачу, и я пытаюсь понять, не потому ли, что мой код неправильный, или я неправильно использую рекурсию.с использованием рекурсии для добавления к переменной

public boolean containsRightRedEdge() { 
    int count = 0; 
    count += containsRightRedEdge(root); 
    if(count > 0) return true; 
    return false; 
} 

private int containsRightRedEdge(Node n) { 
    if (n == null) return 0; 
    if (isRed(n.right)) { 
     return 1; 
    } 
    return containsRightRedEdge(n.left) + 0 + containsRightRedEdge(n.right);   
} 
+2

Если строка 'return containsRightRedEdge (n.left) + 0 + containsRightRedEdge (n.left);' be 'return containsRightRedEdge (n.left) + 0 + containsRightRedEdge (n.right);'? –

+0

Также, как проходит тестирование? Каков ваш вклад? Каков ваш ожидаемый результат? Какова ваша наблюдаемая продукция? – Turing85

+0

@ Turing85 это не мой тест, его профессора, которые только говорят, проходят или терпят неудачу. Воистину, меня беспокоит, если я правильно использую recurison в этом случае. Если да, я напишу свой собственный тест, чтобы узнать, в чем проблема. Я хотел убедиться, что я правильно использовал рекурсию, прежде чем я сделал это, но –

ответ

0

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

2

Я бы сказал, что вы правильно используете рекурсию, но ваш выбор имен методов может быть менее запутанным, и ваша логика может быть упрощена. Я не слишком хорошо знаком с алгоритмом, который вы пытаетесь осуществить, но вы можете попробовать что-то вроде этого:

public boolean containsRightRedEdge(Node root) { 
    return getNumRightRedEdges(root) > 0; 
} 

private int getNumRightRedEdges(Node n) { 
    if (n == null) return 0; 
    if (isRedEdge(n)) return 1; 

    return getNumRightRedEdges(n.left) + getNumRightRedEdges(n.right); 
} 

Обычно рекурсивный метод не должен иметь такое же имя, как нерекурсивен метод. Эти имена методов более четко показывают, что делает каждый. Кроме того, ваши базовые случаи могут быть неправильными, поскольку вы получили их в настоящее время на основе того, как я интерпретирую алгоритм. Конечно, я не знаю код внутри isRed(), поэтому я, вероятно, делаю неправильные предположения.

+0

спасибо @Sean Glover, я кое-что узнал. Отличный чистый код. –

 Смежные вопросы

  • Нет связанных вопросов^_^