【问题标题】:Cost Analysis of Recursive Pascal Triangle Program递归帕斯卡三角规划的成本分析
【发布时间】:2020-08-06 16:08:14
【问题描述】:
#include<iostream>
using namespace std;

int pascal(int row, int col) 
{
  if (col == 0 || col == row) 
  {
    return 1;
  } 
  else
  {
    return pascal(row - 1, col - 1) + pascal(row - 1, col);
  }
}


int main()
{
    system("cls");
    int row;
    cout<<"Enter n : ";
    cin>>row;

    
    for (int i=0;i<row;i++)
    {
        for(int col =0;col<=i;col++)
            cout<<pascal(i,col);

        cout<<"\n";
    }

    return 0;
}

我了解主函数的成本分析,但我无法理解递归函数的成本分析。递归部分 pascal(i-1,j-1) + pascal(i-1,j) 运行了多少次?

【问题讨论】:

  • 好吧,您可以尝试添加一些调试逻辑,以查看对于某些给定的 i, j 值它实际运行了多少次(在顶级调用之前将全局变量设置为 0,并具​​有函数每次调用时加 1,看看结果如何)。看看你是否可以在结果中检测到一个模式,然后看看你是否可以证明它(提示:尝试使用归纳法)。

标签: c++ recursion big-o


【解决方案1】:

首先,我不确定您要计算的确切内容,但您可能希望更多地关注边缘情况,例如否定论点或row &lt; col.

现在,如果没有col == row 条件(并假设col &gt;= 0),总调用次数将是帕斯卡三角的总和,大致为pow(2, col+1) - 1。因此,这是成本的简单上限。

col == row(假设最初是row &gt; col)处,您的树被“截断”。从这一点计算复杂度是一个有趣的数学问题,超出了 Stack Overflow 的范围(尽管您可能想尝试Math Stack Exchange)。

请注意,此代码效率极低 - 在大多数情况下,指数运行时间非常昂贵,而这个特定问题可以通过 memoization 以显着降低的成本(低于 pow(col, 2))来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多