功能语言会浪费内存吗?

时间:2014-05-03 22:11:34

标签: memory memory-management recursion functional-programming imperative-programming

一般来说,我想问一下,

  • 如果一个问题可以通过命令式语言方式和函数式语言方式解决,那么函数式语言会浪费内存,至少不会节省内存,与命令式语言相比, ,函数语言在递归时大量回复,递归推送大量内存堆栈

  • 并按照上述问题进行操作,从内存优化点视图,如果工作可以用命令式语言完成,则不应该(至少不会更糟)比使用函数式语言?


以上问题实际上来自算法问题:

  

保留筹码而不使用额外的空间:

void insert_at_bottom(node **stack, int data)
{
     if( isempty(*stack) ){
      push(stack,data);
      return;
     }
     int temp=pop(stack);
     insert_at_bottom(stack,data);
     push(stack,temp);
}  


void rev_stack(node **stack)
{
     if( isempty(*stack) ) return;
     int temp = pop(stack);
     rev_stack(stack);
     insert_at_bottom(stack,temp);
}

上面的问题可以通过使用双递归来解决,在我看来,即使它没有在代码中使用额外的内存,它实际上也是"隐藏"堆栈中的那些额外空格。


当然,我的问题更一般,你不必专注于上述具体问题。

感谢您的深思熟虑的建议!

2 个答案:

答案 0 :(得分:2)

从理论上讲,没有。您始终可以将迭代算法转换为递归算法,反之亦然。假设使用相同的算法并使用尾调用优化实现,内存消耗的大O将完全相同。

在实际意义上,也许吧。在函数式编程中使用不可变数据结构的风格会占用大量内存。

IMO,使用功能与命令式编程是 style 的问题。使用最适合代码的人。而且,如果您需要从机器中获得最后一盎司的性能,您可以随时编写手动优化的装配。

答案 1 :(得分:1)

这并不容易。

首先,递归,特别是尾递归不需要比循环更多的内存。一般来说尾部调用也是如此。尾调用,无论是否是递归调用,总是可以编译为跳转/分支指令,如果目标机器语言允许这样做。因此,函数式语言中的程序不一定需要比命令式语言中的类似程序具有更大的堆栈。

另一方面,为了最大限度地减少副作用,函数式编程更喜欢处理不可变数据,实际上,函数式编程只允许 不可变数据。因此,功能数据结构往往比命令式语言中的可变数据结构更昂贵。