每个人!
我最初在 Stackexchange 上发布了一个类似的问题;它被移到这里,可以在链接中找到:Declaring a functional recursive sequence in Matlab 我正在尝试在这篇文章中做类似的事情,但我认为 Matlab 不是这样做的地方。我将不得不使用 Pari-GP;在这一点上,没有两种方法。
这本质上是我为自己制作的一个编码项目;这是为了有效地数值评估 Tetration 函数的某种构造。我已经能够在 MatLab 中很好地对其进行编码;问题是,因为我们正在处理像 e^e^e^e^e^e^e 这样的大数;MatLab 中的这些短路。Pari-GP 对通常会导致溢出的数字有更好的理解;我现在完全意识到为什么 Tetration 社区一直在使用它。
尽管如此,Matlab 代码适用于小数字和对它们很好的数字(很好的假想参数)。为了这个问题的完整性;matlab 代码的 github 存储库是https://github.com/JmsNxn92/Recursive_Tetration 虽然这不是我们想要的代码;我进一步优化了它;这不是最新的。但就这个问题而言,这就足够了。
现在,我不是最好的程序员。我可能自 09 年以来就没有编程过;但我仍然知道我的方式。但更多的是我有编码的框架;而更少的实际语法。想象一下自己熟悉法国哲学和法语写作;但是在订购咖啡馆时会磕磕绊绊。
对此,我将停止拐弯抹角,直奔问题。
如果我beta_function
在 Pari-GP 中定义一个函数并将其写为,
beta_function(z,l,n) =
{
out = 0;
for(i=0,n-1,
out = exp(out)/(exp(l*(n-i-z)) +1));
out;
}
一切都很好,并且有效。现在beta_function
MatLab 中的代码并没有太大的不同。没有更复杂的添加。正如我最初要求使用 MatLab 一样,我再次要求使用 Pari-GP。这是编写函数的方法tau_K(z,l,n,k)
;这是完全可行的。我只是错过了一些明显的东西。
MatLab 中的代码tau_K(z,l,n,k)
附在下面。一位友好的人在这里解释了如何在 MatLab 中执行此操作;对于那些感兴趣的人,我并没有真正事先正确定义递归。这是我正在使用的当前 MatLab 代码,
function f = tau_K(z,l,n,k)
if k == 1
f = -log(1+exp(-l*z));
return
end
f = log(1 + tau_K(z+1,l,n,k-1)./beta_function(z+1,l,n)) - log(1+exp(-l*z));
end
问题很简单。如何在 Pari-GP 中定义这种递归?你如何在 Pari-GP 中编码?
当我尝试直接翻译这段代码时,一切似乎都在朝着返回值 0 崩溃。对上帝诚实;我知道这只是因为我在将输出调用到下一次迭代时出现了一些语法错误。我已经尝试了我能想到的一切。和教程,他们似乎没有帮助。我已经尝试过一切。在这一点上,我知道我在语法上遗漏了一些愚蠢的东西。
我只是希望这里有人能像我在幼儿园一样向我解释这一点。我听说尾递归在这里很重要。如果是这样,我将如何编码?只需添加一个跟踪所有内容的变量?
再次感谢您对问题的深入了解。