Другие языки программирования и технологии
Задачка на Delphi, рекурсия...
Если кто знает или когда либо выполнял что-то подобное подскажите как реализовать? Автор предлагает рекурсию, собственно, хотелось бы понять как это реализовать... (Задача из книги "Олимпиадные задачи по программированию , автор Ф. Меньшиков"). Даны N целых чисел x1, x2 ...xn. Расставить между ними знаки '+' или '-' так, чтобы значение получившегося выражения было равно заданному целому S. Ограничения: 2 <= N <= 24, 0 <=xi<= 50 000 000, -1 000 000 000 <= S <= 1 000 000 000. Если решений нет вывести "No Solution".
Ну вот так например:
function FindSum(Sum : Longint; N : Byte) : String;
begin
Inc(N);
if N = KolX then
begin
if Sum + X[N] = S then Result := '+' + IntToStr(X[N])
else if Sum - X[N] = S then Result := '-' + IntToStr(X[N])
else Result := '';
end
else
if Sum + X[N] > S then Result := ''
else
begin
Result := FindSum(Sum + X[N], N);
if Length(Result) > 0 then Result := '+' + IntToStr(X[N]) + Result
else
begin
Result := FindSum(Sum - X[N], N);
if Length(Result) > 0 then Result := '-' + IntToStr(X[N]) + Result;
end;
end;
end;
Где:
KolX - число данных чисел
X - массив данных чисел
S - искомое значение
Вызов:
Str := FindSum(X[1], 1);
Последний штрих:
if Length(Str) > 0 then
begin
Str := IntToStr(X[1]) + Str;
Получена строка! Выведи её.
end
else
Результат не получен.. . Выведи "No Solution"
Правда здесь есть небольшое отступление от условий задачи:
я подразумевал, что S положительное число.. .
Но это легко исправить ;-)
function FindSum(Sum : Longint; N : Byte) : String;
begin
Inc(N);
if N = KolX then
begin
if Sum + X[N] = S then Result := '+' + IntToStr(X[N])
else if Sum - X[N] = S then Result := '-' + IntToStr(X[N])
else Result := '';
end
else
if Sum + X[N] > S then Result := ''
else
begin
Result := FindSum(Sum + X[N], N);
if Length(Result) > 0 then Result := '+' + IntToStr(X[N]) + Result
else
begin
Result := FindSum(Sum - X[N], N);
if Length(Result) > 0 then Result := '-' + IntToStr(X[N]) + Result;
end;
end;
end;
Где:
KolX - число данных чисел
X - массив данных чисел
S - искомое значение
Вызов:
Str := FindSum(X[1], 1);
Последний штрих:
if Length(Str) > 0 then
begin
Str := IntToStr(X[1]) + Str;
Получена строка! Выведи её.
end
else
Результат не получен.. . Выведи "No Solution"
Правда здесь есть небольшое отступление от условий задачи:
я подразумевал, что S положительное число.. .
Но это легко исправить ;-)
Рекурсия - это когда функция вызывает сама себя.
К примеру функцию факториала на любом языке можно задать рекурсией.
К примеру функцию факториала на любом языке можно задать рекурсией.
Организуйте рекурсивный обход такого дерева:
вершина - ноль
каждому К-му уровню дерева будет соответствовать К-ое число из данных целых чисел
Строится дерево так:
у каждой вершины К-го уровня (кроме листьев, т. е. К<Н) есть ровно два потомка: +[(К+1)-ое число] и -[(К+1)-ое число] . Соответственно, при обходе дерева начинаем суммировать числа:
на вершине 0
идем к левому потомку - вычитаем 1-ое число из суммы, а когда пойдем к правому - прибавим 1-ое число к сумме
Кратко описать детали не получается, но, возможно, Вы поняли суть
вершина - ноль
каждому К-му уровню дерева будет соответствовать К-ое число из данных целых чисел
Строится дерево так:
у каждой вершины К-го уровня (кроме листьев, т. е. К<Н) есть ровно два потомка: +[(К+1)-ое число] и -[(К+1)-ое число] . Соответственно, при обходе дерева начинаем суммировать числа:
на вершине 0
идем к левому потомку - вычитаем 1-ое число из суммы, а когда пойдем к правому - прибавим 1-ое число к сумме
Кратко описать детали не получается, но, возможно, Вы поняли суть
Похожие вопросы
- Ошибка в программе delphi. Рекурсия
- Пожалуйста, помогите с задачкой на Delphi
- Подскажите практическую задачку на углубленное понимание что такое рекурсия?
- Помогите пожалуйста! Рекурсия (Delphi).
- Рекурсия поиск на Delphi в цикле WHILE - исправьте код ?
- Придумайте задачку на массив в delphi (pascal)
- Стоит ли использовать рекурсию в целом? (+)
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- Рекурсия, возникли проблемы с изучением рекурсии, не могли бы подсказать книги или видео про обьяснение рекурсии
- Вопрос тем, кто хорошо знаком с рекурсией. Язык Си (но это второстепенно)...