-
Notifications
You must be signed in to change notification settings - Fork 0
zySail/NJUPT_AlgorithmsLab
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
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 0
No packages published