Это же форум по програмированию! Так давайте програмировать!
Чтоб найти к-во возможных деревьев из n элементов, нужно знать к-во возможных деревьев с n-1, n-2 ... и 1 элементами.
К-во деревьев с 1 элементом - 1;
К-во деревьев с 0 елементами тоже 1
теперь мы просто для каждого последующего числа элементов перебираем к-во элементов в левой и правой ветви, чтоб их сумма была нужной. Для каждого такого варианта, к-во возможных вариантов растановки будет произведением к-ва возможных вариантов растоновок в каждой его ветви. Поэтому нужно всего лишь сумировать все эти произведения, и мы получим к-во возможных деревьев для следующего числа элементов.
Теперь можно просто провести описанную выше процедуру необходимое число раз, и мы получим нужное число. :yes:
вот простая программа на Delphi, демонстрирующая данный алгоритм (чтоь она работала на обычном TP, нужно всего лишь уменьшить константу maxsize до примерно 6000(в зависимости от настроек компилятора, чтоб все влезло в один сегмент 65кб))
Код
{$APPTYPE CONSOLE}
const maxsize = 8202;
var m:array[0..maxsize] of extended;
index:word;
x:word;
i:word;
sum:extended;
max:word;
c:char;
begin
max:=1;
m[0]:=1;
m[1]:=1;
sum:=0;
repeat
repeat
write ('input num :');
readln(x);
until (x>1)and(x<=maxsize);
for index:=max+1 to x do
begin
sum:=0;
for i:=0 to index-1 do sum:=sum + (m[i]*m[index-1-i]);
m[index]:=sum;
end;
if x>max then max:=x;
writeln(m[x]);
write('Continue? ');
readln(c)
until (c in ['n', 'N']);
end.
Т.к. результатом выполнения при x>17 резултатом будут очень большие числа
, здесь используются числа с плавающей точкой в которых можно хранить результаты до x=8202 включительно, но с нек. (но очень маленькой) потерей точности вычисления.
ваши мысли/замечания/предложения? :p1: