如何创建算法 Tikz 代码来获取由递归关系有条件定义的数字列表?

如何创建算法 Tikz 代码来获取由递归关系有条件定义的数字列表?

假设我们的首字母为,且$a_{1,0}=0$$a_{1,1}=1$给定一个整数,定义$a_{1,j}=0$$j<0$$n$

$$a_{i,j}=\begin{cases} a_{i-1,\frac{j}{2}} & \text{ if $j$ is even},\\
  a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ is odd}  
  \end{cases}$$

while$2\leq i \leq n$$0\leq j \leq 2^{i-1}$。我如何编写算法 TikZ 代码来生成以下列表(例如$n=6$):

完整代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\begin{document}
Suppose, our initials are $a_{1,0}=0$, $a_{1,1}=1$ and $a_{1,j}=0$ for $j<0$. For given an integer $n$, define

$$a_{i,j}=\begin{cases} a_{i-1,\frac{j}{2}} & \text{ if $j$ is even},\\
  a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ is odd}  
  \end{cases}$$

while $2\leq i \leq n$ and $0\leq j \leq 2^{i-1}$
\end{document}

我想要以下输出:

0 1

0 1 1

0 1 1 2 1

0 1 1 2 1 3 2 3 1

0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1

0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1 5 4 7 3 8 5 7 2 7 5 8 3 7 4 5 1

答案1

这不是 TikZ 解决方案,而是 LuaLaTeX 解决方案。

% !TEX encoding   = UTF-8
% !TEX program    = LuaLaTeX
% !TEX spellcheck = en_GB
\documentclass{article}

\usepackage{luacode}
\usepackage{amsmath}
\usepackage{xcolor}


\begin{document}
Suppose, our initials are $a_{1,0}=0$, $a_{1,1}=1$ and $a_{1,j}=0$ for $j<0$. For given an integer $n$, define
\[
a_{i,j}=%
\begin{cases}
a_{i-1,\frac{j}{2}}                          & \text{ if $j$ è pari},\\
 a_{i-1,\frac{j-1}{2}}+a_{i-1,\frac{j+1}{2}} & \text{ if $j$ è dispari}  
\end{cases}
\]

while $2\leq i \leq n$ and $0\leq j \leq 2^{i-1}$

\noindent
\begin{luacode*}
---------------------------
-- Variables declaration --
---------------------------
local N    = 6
local A    = {}

--------------------
-- Initialization --
--------------------
A[1]    = {}
A[1][0] = 0
A[1][1] = 1

-----------------------------------
-- Computations and tex.printing --
-----------------------------------
tex.print(A[1][0].." "..A[1][0].."\\\\")
for i=2,N do
    A[i] = {}
    for j=0,2^(i-1) do
        if math.ceil(j/2)==math.floor(j/2) then 
            A[i][j] = A[i-1][j/2]
        else
            A[i][j] = A[i-1][(j-1)/2]+A[i-1][(j+1)/2]
        end
        tex.print(A[i][j])
    end
    tex.print("\\\\")
end
\end{luacode*}
% TO TEST
\rule{\textwidth}{1pt}
0 1 1 2 1 3 2 3 1 4 3 5 2 5 3 4 1 5 4 7 3 8 5 7 2 7 5 8 3 7 4 5 1
\end{document}

享受!

答案2

关于数学的有趣问题:)

在数论中,斯特恩-布罗科特树是一种无限完全二叉树,其中的顶点精确对应于正有理数,其值按搜索树的方式从左到右排序。(维基百科)

布罗科树

您的数字列表是 Brocot 树有理数的分子。

我们可以用单维列表或数组获取这些数字。可以手动构建此列表,但也存在一些有用的工具,例如 pgfplots 中的一些工具可用于处理列表和数组,但在这里我想尝试一下arrayjobx。这是 的最新更新arrayjob

嗯,使用 Maple、Mathematica、Maxima 或 Lua 更容易,但为了好玩,我更喜欢 TeX。下一个代码没有优化。我使用了第一个想法……

我们需要定义列表: brocot 列表的递归定义

我还没有读完 arrayjobx 的所有文档,但我认为第一个元素有一个索引 =1。

\documentclass[11pt]{scrartcl}
\usepackage{arrayjobx,tikz} 

\begin{document}
\parindent=0pt 
\newcounter{compt}\setcounter{compt}{2}% we need a counter  
\newarray\brocot
\readarray{brocot}{1}% the real first number
\expandarrayelementtrue% idon't know if this macro is necessary
0\ \brocot(1)\ % I don't try \brocot(0)
\makeatletter
\loop     
 \ifodd\thecompt% iseven is possible with tikz iseven comes from tkz-berge
     \pgfmathtruncatemacro{\tmpabrocot}{(\thecompt-1)/2}%
     \checkbrocot(\tmpabrocot)%
     \let\@tempa\cachedata
     \pgfmathtruncatemacro{\tmpbbrocot}{(\thecompt+1)/2}% 
     \checkbrocot(\tmpbbrocot)%
     \let\@tempb\cachedata 
     \pgfmathtruncatemacro{\tmpbrocot}{\@tempb+\@tempa}%
     \brocot(\thecompt)={\tmpbrocot}% perhaps we can use a better code
     \brocot(\thecompt)\ %   
 \else 
  \pgfmathtruncatemacro{\tmpbrocot}{\thecompt/2}% 
  \checkbrocot(\tmpbrocot)%
  \brocot(\thecompt)={\cachedata}% 
  \brocot(\thecompt)\ %   
 \fi  
\ifnum\thecompt<32 \addtocounter{compt}{1}%
\repeat  

\brocot(25)
\end{document}

在此处输入图片描述

相关内容