Function 伪代码,复杂性

Function 伪代码,复杂性,function,Function,所以我需要为斐波那契函数写两个伪码。我从一个递归定义开始,即 function VAL=fibonacci(N) if N=1 then VAL=1 else if N=2 then VAL=1 else VAL=fibonacci(N-1)+fibonacci(N-2) end if return VAL end function 此外,我以以下方式编写了非递归版本

所以我需要为斐波那契函数写两个伪码。我从一个递归定义开始,即

function VAL=fibonacci(N)  
    if N=1 then  
        VAL=1  
    else if N=2 then  
        VAL=1  
    else  
        VAL=fibonacci(N-1)+fibonacci(N-2)  
    end if  
    return VAL  
end function  
此外,我以以下方式编写了非递归版本:

function VAL=fibonacci(N)  
    f=1  
    VAL=1  
    for I=3 to N  
        f_new=VAL+f  
        f=VAL  
        VAL=f_new  
    end for  
    return VAL  
end function  
如果有人能检查一下这是否合理,那将是非常有帮助的。现在的问题是:我们假设两个整数相加的额外成本是一个单位。估计第一个递归函数和第二个非递归函数的总计算量,单位为N


由于有几个人试图向我解释它,但没有成功,如果有人能给我答案,我将不胜感激。在第一个函数中,您使用递归计算斐波那契的值,它有许多重复计算,例如:f(5)=f(4)+f(3),f(4)=f(3)+f(2)。这里,f(3)被计算两次,这浪费了时间和内存空间,f(2)将被计算三次:f(5)->f(4)->f(3)->f(2),f(5)->f(4)->f(2),f(5)->f(3)->f(2)。假设输入参数N足够大, f(n)=f(n-1)+f(n-2) ... 函数中有大量重复计算。从理论上分析,时间复杂度为O(1.618^n)


但在第二个函数中,函数中的每个n只计算一次,因此时间复杂度为O(n)。

在第一个函数中,您使用递归计算斐波那契的值,该值有许多重复计算,例如:f(5)=f(4)+f(3),f(4)=f(3)+f(2)。这里,f(3)被计算两次,这浪费了时间和内存空间,f(2)将被计算三次:f(5)->f(4)->f(3)->f(2),f(5)->f(4)->f(2),f(5)->f(3)->f(2)。假设输入参数N足够大, f(n)=f(n-1)+f(n-2) ... 函数中有大量重复计算。从理论上分析,时间复杂度为O(1.618^n)


但是在第二个函数中,函数中的每个n只计算一次,因此时间复杂度为O(n)。

感谢您的快速回答,我想我理解了您对第二个函数所说的内容。因此,如果N=1或2,则成本为1,如果N较大,则成本为3/2?但是,第一个函数的计算成本是多少?基于递推方程的第一个函数的复杂性:f(N)=f(N-1)+f(N-2)+O(1)。1.618=(1+sqrt(5))/2,这是数学理论分析中的黄金比例。我们想找到一个满足这个规则的函数:f(n)=f(n-1)+f(n-2)=>x^n=x^(n-1)+x^(n-2)=>x^2=x+1=>x=(1+sqrt(5))/2=1.618很好,很有意义。那么成本将是O((1.618^n)/2)个单位?在O的时间复杂度中,常数复杂度将被忽略,因此时间复杂度为O(1.618^n)非常感谢。我仍然对另一部分O(n)有点困惑。我怎么能得出这个结论呢?谢谢你的快速回答,我想我理解了你对第二个函数所说的话。因此,如果N=1或2,则成本为1,如果N较大,则成本为3/2?但是,第一个函数的计算成本是多少?基于递推方程的第一个函数的复杂性:f(N)=f(N-1)+f(N-2)+O(1)。1.618=(1+sqrt(5))/2,这是数学理论分析中的黄金比例。我们想找到一个满足这个规则的函数:f(n)=f(n-1)+f(n-2)=>x^n=x^(n-1)+x^(n-2)=>x^2=x+1=>x=(1+sqrt(5))/2=1.618很好,很有意义。那么成本将是O((1.618^n)/2)个单位?在O的时间复杂度中,常数复杂度将被忽略,因此时间复杂度为O(1.618^n)非常感谢。我仍然对另一部分O(n)有点困惑。我怎么能得出这个结论呢?