2014-11-12 2 views
0

Предоставлено число d и номер n. Мне нужно распечатать все комбинации длины n, так что первый элемент равен d, а все остальные - 1 удаленность от предыдущей.Не получать правильные ожидаемые результаты

E.g. Для ввода d=4 n=3

Выход

4 3 2 4 3 4 4 5 4 4 5 6

Я написал следующий код, но он отображает каждую строку в два раза ниже -

4 3 2 4 3 2 4 3 4 4 3 4 4 5 4 4 5 4 4 5 6 4 5 6

код -

private static void printNumbers(int d, int n, String comb) { 
    if(n == 0) { 
     System.out.println(comb); 
     return; 
    } 

    printNumbers(d-1, n-1, comb+d+"\t"); 
    printNumbers(d+1, n-1, comb+d+"\t"); 
} 

и вызов метода выглядит -

printNumbers(4,3,""); 

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

+0

Представьте, что вы находитесь в рекурсивном вызове и п = 1 расческа = «ххххх» и d = 2, например, Что будет делать функция printNumbers в этом случае? –

+0

См. Описание вопроса, если 'n = 1'' comb' никогда не будет больше 1 в длину, и гребень всегда начинается с 'd' –

+0

, что неверно ... так как ваша рекурсия уменьшает n и увеличивает длину гребня. . comb = "xxxx" означалось как заполнитель. как я сказал: представьте, что вы ** в ** рекурсии ... означает, что это не первоначальный вызов ... Во всяком случае .. мой вопрос был направлен на тот факт, что я не хотел представить вам ответ, скорее пусть вы обнаружите это для себя. Это точный пример, на который указывают принятые ответы. –

ответ

1

Ваша проблема в том, что когда n == 1, вы звоните:

printNumbers(d-1, 0, comb+d+"\t"); 
printNumbers(d+1, 0, comb+d+"\t"); 

, которая будет печатать строку дважды.

Вы можете легко исправить это, изменив тормозную критерий:

private static void printNumbers(int d, int n, String comb) { 
    if(n == 1) { 
    // ^change here 
     System.out.println(comb + d); 
     //     ^change here 
     return; 
    } 

    printNumbers(d-1, n-1, comb+d+"\t"); 
    printNumbers(d+1, n-1, comb+d+"\t"); 
} 
+0

Gotcha. Ты восхитителен..!! –

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