我无法制作帕斯卡三角形。我需要在递归中追加列表元素,但我的工作结果是列表中附加的列表。你可以帮帮我吗? 我的测试代码是:
def list(row):
if(row is 0):
return 0
return [row, list(row-1)]
如果我使用它,我将返回列表中的列表。我需要列表中的元素
print(list(10))
输出:
[10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]]
预期产出:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
答案 0 :(得分:3)
关于您的具体功能,这是您可以编写的一种方式
def foo (row):
if row == 0:
return [0]
else:
return [row] + foo (row - 1)
print(foo(10))
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
也许更多" pythonic"写作方式
print([10 - x for x in range (0, 11)])
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
关于pascal的三角形,这里有一种方法可以使用辅助助手和延续传递方式编写程序 - 对于那些想知道的人,这个选择是为了使结果可以简单地组合方式和递归调用处于尾部位置,这意味着可以很容易地将此函数放在蹦床上,以便在必要时使其成为堆栈安全
def sliding (n,xs):
if n > len(xs):
return []
else:
return [xs[0:n]] + sliding(n, xs[1:])
def pascal (n):
def aux (m, prev, k):
if n == m:
return k([prev])
else:
return aux(m + 1, [1] + [x + y for (x,y) in sliding(2, prev)] + [1], lambda rest: k([prev] + rest))
return aux(1, [1], lambda x: x)
for line in pascal(5):
print(line)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
答案 1 :(得分:1)
听起来您希望将列表[x]
与调用list(x-1)
后返回的列表连接起来。 python中列表的好处是+
运算符正是这样做的。如果我们将最终退货单更改为return [x] + list(x-1)
,我们就会朝着正确的方向前进。然后你会注意到当x为0时遇到麻烦,因为你无法将一个列表添加到一个整数,所以你需要将你的基本情况改为return [0]
。最后,如上所述,最好避免声明覆盖python内置函数的名称(list
是一个),所以让我们将你的函数重命名为my_list
:
def my_list(row):
if row == 0:
return [0]
return [row] + my_list(row-1)
这并不能让你达到帕斯卡的三角形,但希望你能走上正确的路线。
答案 2 :(得分:1)
你想要的可能就是:
public Rigidbody2D rb;
public Rigidbody2D hook;
public float releaseTime = 0.15f;
private bool isPressed = false;
void Update()
{
if (isPressed)
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Vector3.Distance(mousePos, hook.position) > 2.5f)
{
rb.position = hook.position + (mousePos - hook.position).normalized * 2.5f;
}
else
{
rb.position = mousePos;
}
}
}
void OnMouseDown()
{
isPressed = true;
rb.isKinematic = true;
}
void OnMouseUp()
{
isPressed = false;
rb.isKinematic = false;
StartCoroutine(Release());
}
IEnumerator Release()
{
yield return new WaitForSeconds(releaseTime);
GetComponent<SpringJoint2D>().enabled = false;
this.enabled = false;
}
这将创建一个包含一个元素return [row] + list(row-1)
的列表,并在其上添加另一个列表。
答案 3 :(得分:1)
您可以创建一个输出预期结果的递归范围函数:
def rec_range(n):
return [n] + rec_range(n-1) if n else [0]
>>> rec_range(10)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
希望它有所帮助。
或者只使用range
(python2.x中的xrange
):
>>> list(range(10+1))[::-1] # reverse the list
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
答案 4 :(得分:0)
您可以使用给定的方式创建Pascal的三角形
def pascal(rows):
for i in range (rows):
value=1
List = [value]
for j in range (i):
value = value * ( i-j ) * 1 / ( j + 1 )
List.append(int(value))
print(List)
pascal(5)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]