Безмонадная версия папоротника в отчёте
This commit is contained in:
@@ -311,10 +311,10 @@
|
|||||||
|
|
||||||
\subsubsection{Генерация новой точки}
|
\subsubsection{Генерация новой точки}
|
||||||
|
|
||||||
Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает новую точку.
|
Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку и состояние генератора случайных чисел -- \texttt{gen}, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает пару -- новую точку и новое состояние генератора случайных чисел.
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Код функций для генераций новых точек в папоротнике Барнсли.}, label={lst:genDot}]
|
\begin{lstlisting}[caption={Код функций для генераций новых точек в папоротнике Барнсли.}, label={lst:genDot}]
|
||||||
import System.Random (randomRIO)
|
import System.Random (StdGen, mkStdGen, randomR)
|
||||||
|
|
||||||
applyTransformation :: Point -> Float -> Point
|
applyTransformation :: Point -> Float -> Point
|
||||||
applyTransformation point random
|
applyTransformation point random
|
||||||
@@ -322,25 +322,24 @@
|
|||||||
| random < 0.86 = transformation2 point
|
| random < 0.86 = transformation2 point
|
||||||
| random < 0.93 = transformation3 point
|
| random < 0.93 = transformation3 point
|
||||||
| otherwise = transformation4 point
|
| otherwise = transformation4 point
|
||||||
|
|
||||||
genNextPoint :: Point -> IO Point
|
genNextPoint :: StdGen -> Point -> (Point, StdGen)
|
||||||
genNextPoint point = do
|
genNextPoint gen point =
|
||||||
random <- randomRIO (0.0, 1.0 :: Float)
|
let (random, newGen) = randomR (0.0, 1.0 :: Float) gen
|
||||||
return $ applyTransformation point random
|
in (applyTransformation point random, newGen)
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\subsubsection{Рекурсивная генерация папоротника Барнсли}
|
\subsubsection{Рекурсивная генерация папоротника Барнсли}
|
||||||
|
|
||||||
Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли.
|
Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход текущее состояние генератора случайных чисел, начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли.
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Код функции для построения папоротника Барнсли.}, label={lst:barnsleyFern}]
|
\begin{lstlisting}[caption={Код функции для построения папоротника Барнсли.}, label={lst:barnsleyFern}]
|
||||||
barnsleyFern :: Point -> Int -> IO [Point]
|
barnsleyFern :: StdGen -> Point -> Int -> [Point]
|
||||||
barnsleyFern _ 0 = return []
|
barnsleyFern _ _ 0 = []
|
||||||
barnsleyFern startPoint n = do
|
barnsleyFern gen startPoint n =
|
||||||
x' <- genNextPoint startPoint
|
let (nextPoint, newGen) = genNextPoint gen startPoint
|
||||||
xs <- barnsleyFern x' (n - 1)
|
in startPoint : barnsleyFern newGen nextPoint (n - 1)
|
||||||
return (startPoint : xs)
|
\end{lstlisting}
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Повторяющаяся дилемма заключённого}
|
\subsection{Повторяющаяся дилемма заключённого}
|
||||||
|
|||||||
Reference in New Issue
Block a user