Вроде придумал, для одномерного случая:
{0/1, 1/1}; {1/2}; {1/4, 3/4}; {1/8, 3/8, 5/8, 7/8}; {1/16,3/16,5/16,7/16,9/16,11/16,13/16,15/16};…
То есть в числителе последовательно перебираем все нечетные, в знаменателе чем глубже, тем больше степень двойки. Не надо никаких if и хранения «пройденных» значений.