我正在教一门课程来介绍C ++学生,我想设计一个实验,展示递归函数与迭代的不同之处。我的想法是跟踪两者的内存/调用堆栈使用情况并显示差异。当我完成学位课程时,我几乎肯定我做了类似的事,但不记得了。我的经验并不在于C / C ++,所以任何指导都会受到赞赏。
我相信我可能会错过代表我的任务。我曾希望找到一种方法来展示递归与迭代相比如何增加开销/堆栈。我按照一些建议的链接,提出了以下脚本。
loops=100
counter=0
total1=0
echo "Iteration"
while [ $counter -lt $loops ]; do
"$1" & # Run the given command line in the background.
pid=$! peak1=0
echo -e "$counter.\c"
while true; do
#sleep 0.1
sample="$(pmap $pid | tail -n1 | sed 's/[^0-9]*//g' 2> /dev/null)" || break
if [ -z "$sample" ]; then
break
fi
let peak1='sample > peak1 ? sample : peak1'
done
# echo "Peak: $peak1" 1>&2
total1=$(expr $total1 + $peak1)
counter=$[$counter+1]
done
该程序使用迭代或递归实现二进制搜索。我们的想法是获得平均内存使用量并将其与同一程序的Recursion版本进行比较。这不起作用,因为迭代版本通常具有比递归更大的内存平均值,这不会向我的学生显示递归具有缺点。因此,我很确定我做错了。
pmap不会向我提供我想要的东西吗?
答案 0 :(得分:3)
我认为这样的事情
void recursive(int* ptop) {
int dummy = 0;
printf("stack size %d\n",&dummy - ptop);
recursive(ptop);
}
void start() {
int dummy = 0;
recursive(&dummy);
}
直到它崩溃。
答案 1 :(得分:0)
在任何知道它们的平台上(Linux),回溯(3),甚至更好的 backtrace_symbols(3),他们的同伴应该会有很大的帮助。