如何迭代计算这个序列?

时间:2018-01-04 14:43:14

标签: php algorithm sequence

我想迭代地计算这个序列。

A(0,j)=j+1
A(i,0)=A(i-1,0)
A(i,j)=A(i-1,A(i,j-1))

这是我的尝试

    public function calculsuite1Action($i,$j)
{
    $A = array();
    for ($k = 0; $k <= $i * $i * $i + $j; $k++) {
        $A[0][$k] = $k + 1;
    }
    for ($c = 1; $c <= $i; $c++) {
        for ($k = 0; $k <= $i * $i * $i + $j - $c; $k++) {
            if ($k == 0) {
                $A[$c][$k] = $A[$c - 1][1];
            } else {
                $A[$c][$k] = $A[$c - 1][$A[$c][$k - 1]];
            }
            if ($c == $i && $k == $j) {
                return $A[$i][$j];
            }

        }
    }
}

我正在尝试使用PHP或任何其他编程语言找到解决方案。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

我试过寻找前几个条目的模式。如果我没有犯任何错误,那么序列非常简单。归结为

A(i, j) = j+1

刚刚使用此JavaScript程序验证我没有犯任何错误

for (i = 0; i < 5; i++){
  for (j = 0; j < 5; j++){
    console.log("A("+i+", "+j+") = "+calc(i,j));
  }
}

function calc(i, j){
  if(i==0)
    return j+1;
  else if(j == 0)
    return calc(i-1, 0);
  else
    return calc(i-1, calc(i, j-1));
}

答案 1 :(得分:0)

这是一个堆栈实现。有关我如何转换递归的说明,请参阅here

JavaScript代码:

/**
* A(0,j)=j+1
* A(i,0)=A(i-1,0)
* A(i,j)=A(i-1,A(i,j-1))
***/

// Recursive
function f(i,j){
  if (i == 0) return j+1
  else if (j == 0) return f(i-1,0)
  else return f(i-1,f(i,j-1))
}

// Iterative
function iterative(_i,_j){
  let result = undefined;
  let stack = [[f, [_i, _j]]];

  function g(i){
    let Aij_1 = result;
    stack.push([f, [i-1, Aij_1]]);
  }

  function f(i, j){
    if (!i){
        result = j + 1;
        
    } else if (!j){
        stack.push([f, [i-1, 0]]);
        
    } else {
        stack.push([g, [i]]);
        stack.push([f, [i, j-1]]);
    }
  }

  while (stack.length){
    [func, params] = stack.pop();
    func.apply(func, params);
  }

  return result;
}

for (let i=0; i<11; i++){
  for (let j=0; j<11; j++)
    // Log both iterative and recursive results for comparison
    console.log(
      '(' + i + ', ' + j + ') => ' +
      JSON.stringify([iterative(i,j), f(i,j)])
    );
}