首页 > 解决方案 > 定义一个二维函数数组而不首先单独构造每个函数(Python 或 MATLAB/Octave)

问题描述

(我很高兴在 Python 或 MATLAB/Octave 中完成以下任务。下面我概述了 Python 中的问题。)

我想通过重复定义一个 17x8 的函数数组

if 0<k<16:
    f[k,n+1](j) = A(k,j)*f[k-1,n](j) + B(k,j)*f[k+1,n](j)
elif k==0:
    f[k,n+1](j) = B(k,j)*f[k+1,n](j)
elif k==16:
    f[k,n+1](j) = A(k,j)*f[k-1,n](j)

函数A(k,j)B(k,j)没有索引,它们不需要数组。它们对于这个问题不是必不可少的。循环的初始值由已知值给出

if k==8:
    f[k,0](j)=0
else:
    f[k,0](j)=1

这适用于任意j.

如何在二维数组中反复定义函数数组?我见过这样的例子,它们通过以下方式构造函数数组

myFuncs = [f0,f1,f2]
myFuncs[2](...) #calls f2

myFuncs但是,这需要我在将它们集中到数组中之前创建并命名各个函数。相反,我需要在不命名 17x8 数组中的所有 136 个函数的情况下构建此表。我怎样才能做到这一点?

编辑:为了明确并证明可以将解决方案编写为 k 的函数,我试图解决的递归是

f[k,n+1](j) = sqrt(j+k-8)*f[k-1,n](j) + sqrt(k+j-7)*f[k+1,n](j)

对于 n=1 ,使用 I 的已知值n=0可以获得以下结果:

f[9,1](j) = sqrt(j+1)
f[7,1](j) = sqrt(j)

与其他等于零,然后为n=2

f[10,2](j) = sqrt((j+1)*(j+2))
f[8,2](j) = 2*j+1
f[6,2](j) = sqrt(j*(j-1))

与其他零。但是,手动执行此操作容易出错,我想对此进行概括,因为我希望计算所有这些函数的其他两个递归。

标签: pythonmatlabfunctionoctaverecurrence

解决方案


您可以将其实现为单个递归函数:

function ret = f(k,n,j)
if n==0
   if k==8
      ret = 0;
   else
      ret = 1;
   end
else
   if k==0
      ret = A(k,j) * f(k-1,n-1,j);
   else if k==16
      ret = B(k,j) * f(k+1,n-1,j);
   else
      ret = A(k,j) * f(k-1,n-1,j) + B(k,j) * f(k+1,n-1,j);
   end
end

请注意,这不是计算函数值的有效方法,因为我们将多次重新计算相同的值。最有效的方法是简单地计算 17x8 数组中给定值的所有值,从那里j开始n=1并从那里向上移动。或者,您可以将记忆添加到递归函数以避免重新计算值。


推荐阅读