code: private static List<Segmentation> getSegmentations(String str, int begin, int end, int nbMaxComponents, int minComponentSize, List<CuttingPoint> cuttingPoints) {
  		List<Segmentation> s = new ArrayList<Segmentation>(nbMaxComponents);
  		for(CuttingPoint cp:getPossibleCuttingPoints(str, begin, end, nbMaxComponents, minComponentSize)) {
  			s.add(new Segmentation(str, addToDuplicate(cuttingPoints, cp, nbMaxComponents - 1)));
  			if(nbMaxComponents > 2) {
  				if(cp.isHypen())
  					// recursivity on the left part only if the cp was an hypen
  					if((cp.getIndex() - begin) >= 2*minComponentSize)
  						s.addAll(getSegmentations(str, begin, cp.getIndex(), nbMaxComponents -1, minComponentSize, addToDuplicate(cuttingPoints, cp, nbMaxComponents - 1)));
  				
  				if((end - (cp.getIndex() + cp.getOffset())) >= 2*minComponentSize)
  					s.addAll(getSegmentations(str, cp.getIndex() + cp.getOffset(), end, nbMaxComponents -1, minComponentSize, addToDuplicate(cuttingPoints, cp, nbMaxComponents - 1)));
  			}
  		}
  		return s;
  	}
docs: /*
  Recursively find the segmentation