Lisp 空间与时间的方案代码分析

Lisp 空间与时间的方案代码分析,lisp,scheme,code-analysis,complexity-theory,Lisp,Scheme,Code Analysis,Complexity Theory,我正在学习麻省理工学院经典课程6.001的在线课程:计算机程序的结构和解释 我试图从内存使用和执行时间的角度来理解分析代码复杂性。在前几节课中,他们提出了斐波那契级数的一种方案 视频中呈现的解决方案具有在内存空间中以x(线性递归性能)增长的特点,这给斐波那契级数带来了一个大问题。当您试图找到一个更大的斐波那契数时,递归所需的空间将变得巨大 他们建议尝试找到一种获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于x 我的解决方案如下。我的具体问题是,从内存使用和执行时间

我正在学习麻省理工学院经典课程6.001的在线课程:计算机程序的结构和解释

我试图从内存使用和执行时间的角度来理解分析代码复杂性。在前几节课中,他们提出了斐波那契级数的一种方案

视频中呈现的解决方案具有在内存空间中以x(线性递归性能)增长的特点,这给斐波那契级数带来了一个大问题。当您试图找到一个更大的斐波那契数时,递归所需的空间将变得巨大

他们建议尝试找到一种获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于x

我的解决方案如下。我的具体问题是,从内存使用和执行时间的角度来看,下面的Scheme代码的性能分析是什么

(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时间的十倍左右,同时占用相同的内存量