列表追加递归

时间:2017-07-11 12:19:40

标签: python list recursion append

我无法制作帕斯卡三角形。我需要在递归中追加列表元素,但我的工作结果是列表中附加的列表。你可以帮帮我吗? 我的测试代码是:

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]

5 个答案:

答案 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]