森林树欧几里得分法

森林树欧几里得分法

我想画这样的树:

在此处输入图片描述

在第一个分支中,子节点通过欧几里得除法用其父节点的除数 2 计算得出。在第二个分支中,子节点通过欧几里得除法用其父节点的除数 3 计算得出。依此类推,直到除数 floor(root/2)

该代码能够绘制任意根的第一个分支。

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
div2/.style={
     append/.process={ Ow+PS _>? l_w2 {content}{int(floor(##1/2))}{1}{div2}{}{[##1,##2]}},
     },
[10, div2]
\end{forest}
\end{document}

为了自动绘制其他分支我尝试了这个:

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
  divn/.style args={1} ={
        append/.process={ Ow+PS _>? l_w2 {content}
{int(floor(##1/#1))}{1}{divn}{}{[##1,##2]}},
  },
  %
  tempcounta = {1},
  branches/.style={
     until{2*tempcounta > content}{
        divn={content},
        tempcounta/.pgfmath={tempcounta+1},
     },
  },
  %
  %
[3, branches]
\end{forest}
\end{document}

编辑: 根据成本加运费,我现在有这个:

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest} 
  divn/.style args={1} ={
        append/.process={ Ow+PS _>? l_w2 {content}{int(floor(##1/#1))}{1}{divn={tempcounta}}{}{[##1,##2]}},
  },
  %
  tempcounta = 1,
  branches/.style={
     until={<Rw+P O+P> {tempcounta}{##1*2}{content}}{
        branches/.append style={divn={tempcounta}},
        tempcounta'+=1,
     },
  },
  %
  %
[5, branches]
\end{forest}
\end{document}

答案1

如果您想以这种方式使用 Forest,则需要花更多时间阅读手册并阅读此处和其他地方的示例。问题中的某些代码根本没有意义:例如,它甚至没有尝试访问值,而只是将键的名称作为常规文本提供给 Forest。

如果您想使用常规计数器,我认为您需要使用递归延迟。(我在回答您之前的问题时这样做了,尽管出于不同的原因。)否则,计数器将不会具有您期望的值。

但是,如果您可以使用 PGF 数学函数,forestloopcount那么似乎可以避免显式引入延迟。(我很惊讶,即使是第一次迭代也不需要这样做,因为它使用了content根的。但如果我没记错的话,动态树会自动建立一些延迟(我可能记错了)。

我想你想要这样的东西:

欧几里得除树

这使用了与您给出的条件不同的条件来获得正确的结果,因为我认为循环计数在循环中只增加一次。简单地增加计数太多了。但是,我认为增加两倍的值应该会给出预期的结果。

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\forestset{
  div n/.style={% #1 is the value passed to the style; ##1/##2 is the child content; ##1 is another iteration, if applicable
    append/.process={ Ow+PS n>? _lw2 {content}{int(floor(##1/#1))}{#1-1}{div n=#1}{}{[##2,##1]}},
  },
  div branches/.style={
    until={% loop count is incremented only in the loop, so add 1 to compensate
      > P+nO+n> {int((2*(forestloopcount))+1)}{content}
    }{% we don't want a branch for 1 - the first loop should use 2 and so on
      tempcounta/.pgfmath=forestloopcount,
      tempcounta'+=1,
      div n/.register=tempcounta,
    },
  }
}
\begin{document}
\begin{forest}
  [3, div branches, baseline]
\end{forest}
\begin{forest}
  [10, div branches, baseline]
\end{forest}
\begin{forest}
  [20, div branches, baseline]
\end{forest}
\begin{forest}
  [17, div branches, baseline]
\end{forest}
\end{document}

相关内容