Lisp 空间与时间的方案代码分析
我正在学习麻省理工学院经典课程6.001的在线课程:计算机程序的结构和解释 我试图从内存使用和执行时间的角度来理解分析代码复杂性。在前几节课中,他们提出了斐波那契级数的一种方案 视频中呈现的解决方案具有在内存空间中以x(线性递归性能)增长的特点,这给斐波那契级数带来了一个大问题。当您试图找到一个更大的斐波那契数时,递归所需的空间将变得巨大 他们建议尝试找到一种获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于x 我的解决方案如下。我的具体问题是,从内存使用和执行时间的角度来看,下面的Scheme代码的性能分析是什么Lisp 空间与时间的方案代码分析,lisp,scheme,code-analysis,complexity-theory,Lisp,Scheme,Code Analysis,Complexity Theory,我正在学习麻省理工学院经典课程6.001的在线课程:计算机程序的结构和解释 我试图从内存使用和执行时间的角度来理解分析代码复杂性。在前几节课中,他们提出了斐波那契级数的一种方案 视频中呈现的解决方案具有在内存空间中以x(线性递归性能)增长的特点,这给斐波那契级数带来了一个大问题。当您试图找到一个更大的斐波那契数时,递归所需的空间将变得巨大 他们建议尝试找到一种获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于x 我的解决方案如下。我的具体问题是,从内存使用和执行时间
(define (fib x)
(define (fib-helper target total current-index i-2 i-1)
(if (> current-index target)
(if (= target 1)
0
total)
(fib-helper target
(+ i-2 i-1)
(+ current-index 1)
i-1
(+ i-2 i-1))))
(fib-helper x 1 3 0 1))
看到您对
fib helper
的调用是一个合适的尾部调用,它将在常量空间中运行
不过,我无法在执行时间方面帮助您:)好吧,考虑到
(fib n)
导致n-1
调用fib helper
,您的解决方案以线性时间运行fib-helper
每次迭代只调用自身一次,每次迭代都是尾部调用,因此程序在恒定空间中运行
这意味着对(fib 1000)
的调用应该只占用(fib 100)
CPU时间的十倍左右,同时占用相同的内存量