2016-09-13 34 views
-1

我需要编写一个函数来查找弗洛伊德三角形中的相邻块。如何获得弗洛伊德三角形中的相邻块?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

什么是要找到一个给定值的相邻块(上,左,右,下)的公式。

例如:

  • 输入20→输出左:19,右:21,顶部15,底部:26
  • 输入28→输出左:27,右:-1,顶端: -1,底部:35
  • 输入19→输出左:18,右:20,顶:14,底部:25

非常感谢你提前!

+1

你从[你关于主题的上一个问题](http://stackoverflow.com/q/39467778/2336725)学到了什么? – Teepeemm

回答

2

上升或下降所需的转换由线的标识符唯一确定。如果在给定值n >= 1,你必须要找到的最大整数k这样的:

k(k+1)/2 + 1 <= n <=> k^2 + k + 2(1 - n) <= 0 

这是一个二次多项式函数:

delta = 1 - 8(1 - n) = 8n - 7 > 0 
x1 = (-1 + sqrt(8n-7))/2 and x2 = (-1 - sqrt(8n-7))/2 

x2 < 0 < x1这样的基于0的标识符行是:k := floor((-1 + sqrt(8n-7))/2)

之后:它是n - k,它是n + k + 1,左n - 1和右n + 1。角落案例(最左边/最右边/ ...)也可以发现k,留给读者。 ;)

+0

你如何用递归而不是sqrt来解决它? – bbnn

+0

@beeant:每个算法都可以“人工”递归,但是我不得不说我在这里没有看到任何自然的递归子结构...为什么你想要使用递归? – md5

+0

,因为我试图不使用数学函数。 – bbnn

相关问题