Scheme中此函数的时间复杂度是多少?

Scheme中此函数的时间复杂度是多少?,scheme,time-complexity,Scheme,Time Complexity,我试图在θ符号中找到这个函数的时间复杂度。 现在,n是一个正整数,lst是一个包含2个数字的列表 (define (func n lst) (if (= n 0) lst (accumulate append null (map (lambda (x) (func (- n 1) (list x x))) lst)))) 如您所知,append的时

我试图在θ符号中找到这个函数的时间复杂度。 现在,n是一个正整数,lst是一个包含2个数字的列表

(define (func n lst)
  (if (= n 0) lst
      (accumulate append null
                  (map (lambda (x)
                         (func (- n 1) (list x x)))
                       lst))))
如您所知,append的时间复杂度为Θ(n),其中n是列表的总体大小。我试着看看如果我把append和accumulate当作Θ(1)函数,会发生什么,然后我得到:

T(n)=2T(n-1)+Θ(1),即-->Θ(2^n)

这是否意味着θ表示法中这个东西的实际时间复杂度远大于Θ(2^n)

我甚至不确定单凭这个假设我是对的,而且不管怎样,如果我需要同时考虑积累和附加,我不知道该怎么做

我在这件事上浪费了好几个小时,我真的不明白为什么我不能自己解决这个问题。。。 任何帮助都将不胜感激

顺便说一句,这里是累积代码:

(define (accumulate op init lst)
   (if (null? lst)
       init
          (op (car lst)
             (accumulate op init (cdr lst)))))

如果你看一下输出,这听起来似乎是有道理的

(func 3 (list 1 2 3))
=> (1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3)
对于lst 2^n的每个元素,将创建元素,即l*2^n。算法可能更糟


显然这是不好的。函数accumulate不是尾部递归函数,因此func也不是。一个2^n的非尾部递归函数是非常无用的。

我也在尝试得到更精确、更合理的解释,但现在我认为你的思路是正确的,因为你在每次调用中都会产生2个新的递归,这将导致O(2^n)的复杂性。首先,感谢你的帮助。我知道这是一个无用的函数,但它是作为一个家庭作业问题给我的。(在最初的问题中,情况甚至更糟,我没有被告知n和lst,所以lst可以是一个包含20个或更多数字的列表)