【问题标题】:Is there a shorter method to finding the answer the value of m[i,j] where m[i, j] = m[i-1,j] + m[i, j-1] + 1?有没有更短的方法来找到答案 m[i,j] 其中 m[i, j] = m[i-1,j] + m[i, j-1] + 1 的值?
【发布时间】:2019-09-12 15:06:35
【问题描述】:

我的作业中有一个问题涉及数组和 for 循环。

问题要求你找出int(m[3,4])的值。

import numpy as np

m = np.zeros((20,20))

for i in range(1,20):
  for j in range(1,20):
    m[i,j] = m[i-1,j]+m[i,j-1]+ 1

print(int(m[3,4])) 

我已经尝试写出ij 的所有m[i, j] 值在0 到5 的范围内以找到m[3,4],但我想知道是否有更短的处理方式?

预期的答案是 34。

【问题讨论】:

  • 这是一个问题吗?您已经发布了可以快速解决此问题的代码。
  • 是的,所以这个问题实际上是针对我们无法访问 IDLE 的笔试(所以一切都必须在笔和纸上完成)。我只是想看看是否有一种方法可以让您不必逐个计算 m[i,j] 的每个值,其中 i 和 j
  • 提示:n 选择 k 减 1

标签: python arrays ranged-loops


【解决方案1】:

这只是项减 1 的帕斯卡三角形。

因此复杂性与找到 n 选择 k 相同。

Is there a math nCr function in python?

import operator as op
from functools import reduce

def ncr(n, r):
    r = min(r, n-r)
    numer = reduce(op.mul, range(n, n-r, -1), 1)
    denom = reduce(op.mul, range(1, r+1), 1)
    return numer / denom

有了这个,

m[i, j] = ncr(i+j, i) - 1

【讨论】:

  • 鉴于 OP 说“在笔和纸上”,可能可以使用明确使用阶乘的版本,即(i+j)! / i! / j! - 1,其中!factorial function
【解决方案2】:

我建议写出一个例子,然后找出规律。打印生成的 5x5 矩阵,您会看到

[[ 0.  0.  0.  0.  0.]
 [ 0.  1.  2.  3.  4.]
 [ 0.  2.  5.  9. 14.]
 [ 0.  3.  9. 19. 34.]
 [ 0.  4. 14. 34. 69.]]

注意矩阵是对称的,即m[i,j] == m[j,i]。由此,您将知道您只需要进行一半的计算。您可以先找到下三角矩阵或上三角矩阵,然后通过对称得到答案。

【讨论】:

    【解决方案3】:

    另一种解决方案:

    Python 3.8.0b4 (default, Sep  5 2019, 14:10:43)
    Type 'copyright', 'credits' or 'license' for more information
    IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: import numpy as np
    
    In [2]: N = 20
    
    In [3]: m = np.zeros((N, N), int)
    
    In [4]: x = m[:]
    
    In [5]: for i in range(1, N):
       ...:     for j in range(1, N):
       ...:         m[i, j] = m[i - 1, j] + m[i, j - 1] + 1
       ...:
    
    In [6]: for i in range(1, N):
       ...:     x[i] = [sum(x[i - 1, :j]) + j for j in range(N)]
       ...:
    
    In [7]: (m == x).all()
    Out[7]: True
    

    【讨论】:

      【解决方案4】:

      对于从 1 到 20 范围内的所有 i,j 是 400 项。你可以通过计算12个词找到答案

      这是矩阵:

      a-----b-----c-----d
      
      e-----f-----g-----h
      
      i-----j-----k-----l
      
      m-----n-----o-----p
      

      每一项是相邻的左边和上面的和加1。例如k = j + g + 1

      现在遍历矩阵。对于 i,j = 1,1,前 2 项归零,所以 a = 1,

      a 右边或下面的所有项都加 1。现在我们有:

      1-----2-----3-----4
      
      2-----f-----g-----h
      
      3-----j-----k-----l
      
      4-----n-----o-----p
      

      现在

      f = 2 + 2 + 1 = 5
      g = 5 + 3 + 1 = 9
      

      继续获得:

      1-----2-----3-----4
      
      2-----5-----9-----14
      
      3-----9-----19-----34<--
      
      m-----n-----o-----p
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多