首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-23 来源:读书人网 【读书人网(Reader8.cn):综合教育门户网站】
全排列的程序,看不懂啊,请帮忙给注释下啊int n 0void swap(int *a, int *b) {int mm *a*a *b*b

全排列的程序,看不懂啊,请帮忙给注释下啊
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; 
}  
[解决办法]
楼主 关于递归,是入栈的学问,每次函数执行完成 都将返回到当初的入口点继续执行 把握住这一点  你就能虑清楚整个程序,是个很纠结脑细胞的过程 如果你脑子没这么好的逻辑思考 那不妨拿张纸画一画  你的这段代码因为递归外边有循环,涉及到很多次递归调用  多画画就清楚了。