读书人

全排列的程序看不懂啊请帮忙给注释上

发布时间: 2013-01-23 10:44:49 作者: rapoo

全排列的程序,看不懂啊,请帮忙给注释下啊
int n = 0;

void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m) //为何会有k>m的情况呢?
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++) //为什么做这个循环就可以了呢?
{
swap(&list[k], &list[i]); //??
perm(list, k + 1, m); //??
swap(&list[k], &list[i]); //??
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}

[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
退出条件
参数有哪些
返回值是什么
局部变量有哪些
全局变量有哪些
何时输出
会不会导致堆栈溢出

[解决办法]
这代码和我博客文章中的代码非常像。。。

楼主看下《STL系列之十 全排列(百度迅雷笔试题)》
http://blog.csdn.net/morewindows/article/details/7370155
里面不但讲了递归的实现,还讲了非递归的实现。
[解决办法]
#include <stdio.h>
#include <iostream>
using namespace std;
int n = 0,nn=0;

//此函数实现list数组里两个值的交换,不过多注释
void swap(int *a, int *b)
{


int m;
m = *a;
*a = *b;
*b = m;
}
//perm函数递归调用,实现全排列,具体注释见句后
void perm(int list[], int k, int m)
{
int i;
if(k > m) //输出当前数组
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++) // 循环+递归
{

swap(&list[k], &list[i]); //交换
perm(list, k + 1, m);//递归到k=5 执行k>m 输出

swap(&list[k], &list[i]); //递归弹出后 执行交换
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
printf("total:%d\nn", n);
cin.get();
return 0;
}
[解决办法]
楼主 关于递归,是入栈的学问,每次函数执行完成 都将返回到当初的入口点继续执行 把握住这一点 你就能虑清楚整个程序,是个很纠结脑细胞的过程 如果你脑子没这么好的逻辑思考 那不妨拿张纸画一画 你的这段代码因为递归外边有循环,涉及到很多次递归调用 多画画就清楚了。

读书人网 >C++

热点推荐