可以这样做尾巴递归吗?

时间:2015-08-06 18:15:33

标签: scala future spray tail-recursion

我正在点击返回分页JSON响应的HTTP端点。 ' meta.next'的价值  在我的响应类型中指向响应的下一页。当此值为null时,不再有页面  检索。  我使用Spray IO发出HTTP请求。我收集每个感兴趣的条目  页面响应并将其与目前收集的内容连接起来。当下一个成为  null,我返回所有收集的条目。  我的问题:有没有办法制作“getJson(...)'函数低于尾递归?

AudioFile

1 个答案:

答案 0 :(得分:3)

尾递归在这里并不适用。当您使用未来的组合器时,您不会在单个堆栈上运行。

具体而言,getJson会立即返回。通过使用jsr.flatMap,您正在注册一个回调,只有在收到HTTP请求的响应时才会调用该回调。因此,getJson的下一次调用也将在此上下文中发生,即在隐式执行上下文提供的回调堆栈上。

因此,虽然递归仍然在算法级别上发生,但它并不会导致在一个(或任何)线程的堆栈上添加堆栈帧。

关于吹栈,你的代码很好。还有其他原因要使用尾递归吗?