我需要构建一个看起来像这样的树:
因此,我从用户那里获取了 2 个数字,a
并且b
. a
定义行数,并b
定义起始根节点值。所以如果我有a
=5 和b
=3,那么我们得到:
我基本上只是将它打印到控制台。我真的迷失了如何开始。谁能在正确的方向上给我一点推动?
我需要构建一个看起来像这样的树:
因此,我从用户那里获取了 2 个数字,a
并且b
. a
定义行数,并b
定义起始根节点值。所以如果我有a
=5 和b
=3,那么我们得到:
我基本上只是将它打印到控制台。我真的迷失了如何开始。谁能在正确的方向上给我一点推动?
这是帕斯卡三角形,第 n 行第 k 列的值为 b *(n 选择 k),其中 n 和 k 都是零索引,并且(n 选择 k)= n!/ (k! * (nk)!)
一旦你弄清楚了这一点,那么解决问题的方法就是编写一个函数int choose(int n, int k)
并在控制台上布置正方形。
布局是最难的部分,但这里有一个方法:
int choose(int n, int k)
printf("%-*d ", W, b * choose(n, k));
它们以保持它们对齐。一种方法可能是向下“增长”树......给定行数,您可以计算出树中有多少元素并分配适当大小的数组。
然后从顶部开始,假设行从 1 开始编号,down_left(x) = x + row(x)
其中x
是数组索引,row(x)
是所属行号x
。down_right(x) = down_left(x) + 1
.
从顶部开始,然后向下左和向下右。然后对于您刚刚创建的下一行中的每个元素执行相同的操作,除了添加到下面的行以获得“父”数字的累积效果。
例如,如果用户要求 3 行和 3 的根值。
您知道您将需要 6 个数组元素。分配 6 个元素并将它们归零。
第 1 行:放入3
数组 [0]。第 n 行:通过查看前一行中的每个元素来创建,称为 i。然后做array[down_left(i)] += i
和array[down_right(i)] += i
。这将创建第 n 行。重复。
无论如何,这是一个粗略的想法,玩一玩,看看它会把你带到哪里...... :)