<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189206</guid>
        <pubDate>Fri, 06 Feb 2009 17:49:11 +0000</pubDate>
        <title>из Pascal в XLisp</title>
        <link>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189206</link>
        <description><![CDATA[amk: Да, алгоритм действительно лучше подходит для императивных языков<br><br>Матрицу можно хранить в виде списка<br>( (1 2 23) (1 3 12) (2 3 25) (2 5 22) (2 8 35) (3 4 18) (4 6 20) и т.д.)<br>а вот как вводить...]]></description>
        <author>amk</author>
        <category>Lisp</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189145</guid>
        <pubDate>Fri, 06 Feb 2009 15:44:38 +0000</pubDate>
        <title>из Pascal в XLisp</title>
        <link>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189145</link>
        <description><![CDATA[Stari: Спасибо за подсказку.<br><br>алгоритм я то понимаю(примерно :) ), и возможно сделал бы данную задачку на процедурном языке, но на функциональном, я не совсем понимаю как это сделать...<br>массивы заменить списками, циклы - рекурсией(хз как), как вводить матрицу растояний.<br>вообщем, я в ступоре...<br> :huh:]]></description>
        <author>Stari</author>
        <category>Lisp</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189089</guid>
        <pubDate>Fri, 06 Feb 2009 14:26:04 +0000</pubDate>
        <title>из Pascal в XLisp</title>
        <link>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2189089</link>
        <description><![CDATA[amk: Ты пытаешься идти от некоей реализации алгоритма, а надо понять сам алгоритм.<br>
<br>
Насколько я понял из приведенного текста, это жадный алгоритм, который строит минимальное остовное дерево, соединяющее все точки.<br>
Там ошибка в функции Findmin в условии If, д.б. <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">If (Matrix[i,j] &#60; min) and (Color[i] &#60;&#62; Color[j]) then</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Изначально все точки раскрашиваются, каждая в свой цвет<br>
Далее<br>
На каждом цикле<br>
. ищется две ближайшие друг к другу точки, еще не соединенные кусками дерева (разного цвета)<br>
. Эти точки соединяются и перекрашиваются в один цвет (собственно нужно перекрашивать только один из кусков)<br>
<br>
цикл продолжается, пока не будут соединены все точки (проходов на один меньше, чем число точек).<br>
<br>
Куски дерева можно отслеживать и другими способами (использованный здесь не самый эффективный).<br>
<br>
Это сжатое изложение алгоритма, не знаю, пригодится ли.<br>
С лиспом (Common LISP, кажется) не работал уже слишком давно, а что такое xlisp даже не знаю.]]></description>
        <author>amk</author>
        <category>Lisp</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2187601</guid>
        <pubDate>Wed, 04 Feb 2009 16:47:12 +0000</pubDate>
        <title>из Pascal в XLisp</title>
        <link>https://forum.sources.ru/index.php?showtopic=264141&amp;view=findpost&amp;p=2187601</link>
        <description><![CDATA[Stari: Здравствуйте<br>
<br>
Возникла необходимость реализовать на xlisp программу реализующюю решение алгоритма Прима–Краскала<br>
<br>
У меня есть исходник программы на паскале, но так как познания лиспа ограничиваются решением нескольких задач, данная задача мне затруднительна<br>
<br>
Я не прошу у вас готового решения(хотя если есть возможность его сделать, то пожалуйста  ;) ), а прошу подсказать,как это реализовывать, принципы программирования абсолютно разные, может проще новую написать, а может и паскалевскую переделать возможно<br>
<br>
вот задача на паскале<br>
<em class='tag-i'><br>
Для реализации алгоритма понадобятся:<br>
Matrix – матрица расстояний, значение пересечении i-ой строки и j-го<br>
столбца равно расстоянию между i-ой и j-ой вершинами. Если такого ребра<br>
нет то значение равно Infinity – просто большому числу (машинная<br>
бесконечность);<br>
Color – массив цветов вершин;<br>
Ribs – в этом массиве запоминаются найденные ребра;<br>
a, b – вершины, соединяемые очередным минимальным ребром<br>
len – длина дерева.<br>
Матрицу расстояний будем хранить в текстовом файле INPUT.MTR, где число на<br>
первой строке – количество вершин n, а остальные n строк по n чисел в<br>
каждой – матрица расстояний. Если расстояние равно 1000 (Infinity), то<br>
такого ребра нет.<br>
<sub class='tag-sub'><br>
Program Algorithm_PrimaKrascala;<br>
Uses Crt;<br>
Const MaxSize =100;<br>
Infinity =1000;<br>
Var Matrix: array[1..MaxSize, 1..MaxSize] of integer;<br>
Color: array[1..MaxSize] of integer;<br>
Ribs: array[1..MaxSize] of record<br>
a, b: integer;<br>
end;<br>
n, a, b, k, col, i, len: integer;<br>
<br>
Procedure Init;<br>
Var f: text;<br>
i, j: integer;<br>
Begin<br>
Assign(f, &#39;INPUT.MTR&#39;);<br>
Reset(f);<br>
Readln(f, n);<br>
For i:=1 to n do<br>
Begin<br>
For j:=1 to n do read(f, matrix[i, j]);<br>
Readln(f)<br>
End;<br>
For i:=1 to n do color[i]:=i;<br>
len:=0<br>
End;<br>
<br>
Procedure Findmin(var a, b: integer);<br>
Var min, i, j: integer;<br>
Begin<br>
min:=infinity;<br>
For i:=1 to n-1 do<br>
For j:=i+1 to n do<br>
If (Matrix[i, j]color[j]) then<br>
Begin<br>
min:=Matrix[i, j];<br>
a:=i;<br>
b:=j<br>
End;<br>
len:=len+min<br>
end;<br>
<br>
Begin<br>
Clrscr;<br>
Init;<br>
For k:=1 to n-1 do<br>
Begin<br>
Findmin(a, b);<br>
Ribs[k].a:=a;<br>
Ribs[k].b:=b;<br>
col:=Color[b];<br>
For i:=1 to n do<br>
If color[i]=col then color[i]:=color[a];<br>
End;<br>
For i:=1 to n-1 do<br>
Writeln(ribs[i].a, &#39; –&#39;, ribs[i].b);<br>
Writeln(&#39;Length= &#39;, len);<br>
Readkey<br>
End.<br>
</sub><br>
Для такого входного файла<br>
8<br>
0 23 12 1000 1000 1000 1000 1000<br>
23 0 25 1000 22 1000 1000 35<br>
12 25 0 18 1000 1000 1000 1000<br>
1000 1000 18 0 1000 20 1000 1000<br>
1000 22 1000 1000 0 23 14 1000<br>
1000 1000 1000 20 23 0 24 1000<br>
1000 1000 1000 1000 14 24 0 16<br>
1000 35 1000 1000 1000 1000 16 0<br>
программа напечатает:<br>
1–3<br>
5–7<br>
7–8<br>
3–4<br>
4–6<br>
2–5<br>
1–2<br>
Length= 125.<br>
</em>]]></description>
        <author>Stari</author>
        <category>Lisp</category>
      </item>
	
      </channel>
      </rss>
	