2015-11-23 2 views
0

Я пытаюсь вернуть глубину строки в дерево radix после нахождения строки в дереве radix, но я всегда получаю значение 2.Возвращаем добавочное значение после рекурсивного вызова метода

Как сохранить значение счетчика после его увеличения и получить метод recursiv depth(nextNodeEdge, restString), вызываемый несколько раз?

Код:

private int depth(TrieNode node, String s) { 
    int count = 1; 

    String communsubString = checkEdgeString(node.getNext(), s); 
    String restString = s.substring(communsubString.length()); 
    if (node.getNext() != null && !node.getNext().isEmpty()) { 
     for (TrieNode nextNodeEdge : node.getNext()) { 
      if (nextNodeEdge.getEdge().equals(communsubString)) { 
       count++; 
       if (!restString.isEmpty()) { 
        count = depth(nextNodeEdge, restString); 

       } else { 
       System.out.println("Found"); 
       } 
      } 
     } 
    } 


    return count; 
} 
+0

Что вы хотите сделать с возвращенным значением 'глубины (nextNodeEdge, restString)'? Добавьте его к 'count'? – Tom

+0

'count' никогда не принимает значение, отличное от' 1' или '2'. Если вы хотите измерить глубину узла во время рекурсивного вызова, вам необходимо передать * текущую глубину * в качестве параметра или увеличить возвращаемое значение глубины. В настоящее время 'depth()' не знает глубины узла, с которым он вызван, поэтому он также не может его вернуть. – dhke

+1

Вы пытались сменить 'count = depth (...)' на 'count + = depth (...)'? – OldCurmudgeon

ответ

2

Вы можете просто изменить:

   count = depth(nextNodeEdge, restString); 

в

   count += depth(nextNodeEdge, restString); 
+0

Я пробовал, но он не работает. Я все еще получаю 2 в качестве возвращаемого значения метода –

+0

@Robin - тогда 'restString.isEmpty()' должен всегда возвращать 'true'. – OldCurmudgeon

0

Другое решение, чтобы сделать Ваш подсчет Mutable.

Использовать Mutable<Integer> в качестве вашего счета и передать его стеке recusrion.

class Mutable<T> { 
    T it; 
    public Mutable(T it) { 
     this.it = it; 
    } 
    public T getIt() { 
     return it; 
    } 
    public void setIt(T it) { 
     this.it = it; 
    } 
} 
private int depth(TrieNode node, String s) { 
    return depth(new Mutable<Integer>(0), node, s).getIt(); 
} 
private Mutable<Integer> depth(Mutable<Integer> count, TrieNode node, String s) { 
    count.setIt(count.getIt() + 1); 
    String communsubString = checkEdgeString(node.getNext(), s); 
    String restString = s.substring(communsubString.length()); 
    if (node.getNext() != null && !node.getNext().isEmpty()) { 
     for (TrieNode nextNodeEdge : node.getNext()) { 
      if (nextNodeEdge.getEdge().equals(communsubString)) { 
       count.setIt(count.getIt() + 1); 
       if (!restString.isEmpty()) { 
        depth(count, nextNodeEdge, restString); 
       } else { 
        System.out.println("Found"); 
       } 
      } 
     } 
    } 
    return count; 
} 
+0

Спасибо за ответ. Я тестирую это решение, я получаю 6 вместо 3 (корень узла + родительский узел + ребенок). –

0

Это решение работает для меня. Мне нужно добавить break после этой строки count += depth(nextNodeEdge, restString); и в блоке еще count++;

Код

private int depth(TrieNode node, String s) { 

    int count = 1; 
    String communsubString = checkEdgeString(node.getNext(), s); 
    String restString = s.substring(communsubString.length()); 
    if (node.getNext() != null && !node.getNext().isEmpty()) { 
     for (TrieNode nextNodeEdge : node.getNext()) { 
      if (nextNodeEdge.getEdge().equals(communsubString)) { 
       if (!restString.isEmpty()) { 
        count += depth(nextNodeEdge, restString); 
        break; 

       } else { 
       System.out.println("Found"); 
       count++; 
       } 
      } 
     } 
    }  
    return count; 
} 
Смежные вопросы