我正在通过麻省理工学院在线课程中的经典6.001课程:计算机程序的结构和解释。
我正在努力了解在内存使用情况与执行时间方面分析代码复杂性。在前几个讲座中,他们提出了Fibonacci系列方案的解决方案。
他们在视频中呈现的解决方案是具有x(线性递归性能)在内存空间中增长的特性,这对Fibonacci系列来说是个大问题。当您尝试找到更大的Fibonacci数时,递归所需的空间变得非常大。
他们建议尝试找到获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于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))
答案 0 :(得分:2)
好吧,考虑到(fib n)
导致n-1
调用fib-helper
,您的解决方案将以线性时间运行。 fib-helper
每次迭代只调用一次,每次迭代都是尾调用,因此你的程序在恒定的空间内运行。
这意味着对(fib 1000)
的调用只占用(fib 100)
的CPU时间的十倍,同时占用相同的内存量。
答案 1 :(得分:1)
看到你对fib-helper
的调用是一个正确的尾调用,它将在恒定的空间内运行。
我无法帮助你执行时间:)