Другие языки программирования и технологии

Задачка на 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 положительное число.. .
Но это легко исправить ;-)
Михаил Гнепа
Михаил Гнепа
92 825
Лучший ответ
Рекурсия - это когда функция вызывает сама себя.
К примеру функцию факториала на любом языке можно задать рекурсией.
Виктор Стриха
Виктор Стриха
31 781
Организуйте рекурсивный обход такого дерева:
вершина - ноль
каждому К-му уровню дерева будет соответствовать К-ое число из данных целых чисел
Строится дерево так:
у каждой вершины К-го уровня (кроме листьев, т. е. К<Н) есть ровно два потомка: +[(К+1)-ое число] и -[(К+1)-ое число] . Соответственно, при обходе дерева начинаем суммировать числа:
на вершине 0
идем к левому потомку - вычитаем 1-ое число из суммы, а когда пойдем к правому - прибавим 1-ое число к сумме
Кратко описать детали не получается, но, возможно, Вы поняли суть