相关疑难解决方法(0)

什么是尾部呼叫优化?

很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?

language-agnostic algorithm recursion tail-recursion tail-call-optimization

765
推荐指数
8
解决办法
15万
查看次数

每次递归都可以转换成迭代吗?

一个reddit线程提出了一个显然有趣的问题:

尾递归函数可以简单地转换为迭代函数.其他的,可以通过使用显式堆栈进行转换.可每次递归转化为迭代?

帖子中的(计数器?)示例是对:

(define (num-ways x y)
  (case ((= x 0) 1)
        ((= y 0) 1)
        (num-ways2 x y) ))

(define (num-ways2 x y)
  (+ (num-ways (- x 1) y)
     (num-ways x (- y 1))
Run Code Online (Sandbox Code Playgroud)

language-agnostic iteration recursion

175
推荐指数
7
解决办法
7万
查看次数

MATLAB的垃圾收集器?

你的心理模型是什么?它是如何实现的?它有哪些优点和缺点?MATLAB GC与Python GC

我有时会在使用MATLAB嵌套函数时看到奇怪的性能瓶颈,否则看起来无关紧要,我确信这是因为GC.垃圾收集器是VM的重要组成部分,Mathworks不会将其公开.

我的问题是关于MATLAB自己的和GC!不是关于Java/COM对象的处理/防止"内存不足"错误/堆栈变量的分配.

编辑:第一个回答实际上是元回答"我为什么要关心?".我很关心因为GC在实现链表MVC模式时表现出来.

matlab garbage-collection memory-management

28
推荐指数
2
解决办法
2万
查看次数

MATLAB中有"队列"吗?

我想将递归函数转换为迭代函数.我通常做的是,我初始化一个队列,把第一个作业放入队列.然后在while循环中,我从队列中消耗作业并将新的作业添加到队列中.如果我的递归函数多次调用自身(例如,走一棵树有很多分支),就会添加多个作业.伪代码:

queue = new Queue();
queue.put(param);
result = 0;

while (!queue.isEmpty()) {
    param = queue.remove();
    // process param and obtain new param(s)
    // change result
    queue.add(param1);
    queue.add(param2);
}

return result;
Run Code Online (Sandbox Code Playgroud)

我在MATLAB中找不到任何类似结构的队列.我可以使用vector来模拟队列中添加3的队列:

a = [a 3]
Run Code Online (Sandbox Code Playgroud)

和删除元素是

val = a(1);
a(1) = [];
Run Code Online (Sandbox Code Playgroud)

如果我正确地使用MATLAB,这种方法将成为性能杀手.

在MATLAB中使用队列是否有理智的方法?

那么其他数据结构呢?

queue matlab data-structures

21
推荐指数
3
解决办法
3万
查看次数