Skip to content

zySail/NJUPT_AlgorithmsLab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

49 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

南京邮电大学_数据结构与算法实验周_递归函数调用关系分析题目解法

1.问题描述:
    递归函数是许多算法和程序中的重要组成部分,特别是在解决复杂问题时。分析程序中的递归函数调用关系,构建递归函数调用关系图,并基于此图进行关键依赖路径的分析,可以帮助我们识别程序中的性能瓶颈和优化路径。
    给定一组 C/C++ 语言的源代码测试用例,每个测试用例包含一个 .c 或 .cpp 文件,且包含一个 main 函数。要求分析这些代码中的 递归调用相关信息,并基于此构建递归函数调用关系图,同时分析关键路径。
2.需要实现的功能:
    [1]	识别程序中的所有递归函数及其调用关系,收集以下信息:
        1、每个递归函数的名称及其调用的其他函数.
        2、函数的调用频率(运行时监控每个函数的调用次数).
        3、递归调用的深度(记录每次递归调用的层次深度)。
    [2]	使用有向图表示递归函数之间的调用关系。图中的节点表示函数,边表示函数调用路径。特别关注递归函数的自调用或多级递归调用。
    [3]	基于递归函数调用图,分析函数之间的关键依赖路径。通过权重计算来识别重要的路径,权重可以基于:
        1、调用频率:路径上函数被调用的总次数。
        2、递归深度:路径上递归函数的最大递归深度。
        3、执行时间(可选):路径上函数的执行时间总和。
    使用这些指标计算出每条路径的权重,找出对程序整体性能影响最大的路径。
    [4]	输出递归函数调用关系图,并使用图形工具如(Graphviz)生成图像,标记关键依赖路径。
    [5]	最好有个简单直观的界面,以便展示上述功能。

测试用例:
输入:
int main() {
    funcA();
    return 0;
}
// 函数定义
void funcA() {
    std::cout << "In funcA" << std::endl;
    funcB();  // 调用 funcB
    funcC();  // 调用 funcC
}
void funcB() {
    std::cout << "In funcB" << std::endl;
    funcA();  // 调用 funcA (递归调用)
}
void funcC() {
    std::cout << "In funcC" << std::endl;
    funcD();  // 调用 funcD
}
void funcD() {
    std::cout << "In funcD" << std::endl;
    funcD();  // 自我调用(递归)
}
(限制条件:假设funcA、B、C、D最大调用次数分别为4、3、1、5)

预期输出:
Recursive Functions:
funcA
funcB
funcD

Function Call Statistics:
funcA: Called 4 times(调用次数), Max Depth: 7(最大递归层数)
funcB: Called 3 times, Max Depth: 6
funcD: Called 5 times, Max Depth: 7

相较测试文件提升之处:
1.支持忽略函数声明,只检测函数定义
2.支持检测main函数中调用多函数的识别和递归检测
3.支持忽略文件中未定义的函数调用检测,如printf()、for()等等


项目缺陷:
1.无法去除多行注释
2.无法识别main函数中定义的函数
3.无法绘出多分支函数调用
4.无法绘出main函数中调用多个函数的函数调用图

About

南京邮电大学算法实验周解法

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published