| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3723 人关注过本帖, 2 人收藏
标题:【木有人?】递归全排列问题
只看楼主 加入收藏
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
关于递归怎么返回   尽量简单化  去看它   
当递归 遇到出口后  你的思路也要跟着出来 自己不要再去递归啦   说实话调试递归很痛苦 因为很难知道自己要几重天啦
直接到出口改去的地方  
例如:
            1)SWAP(list[i],list[j],temp);
            2)perm(list,i+1,n);
            3)SWAP(list[i],list[j],temp);
递归的是2)perm   出来后直接看 3)就可以  因为每层都一样所以每层都有个3) 此时记住是回退到上一层 思路应该清晰啦  即使是在别的递归当回退后下面没有了“语句” 但是不要忘记后面一定还有条 “}”  
2011-05-10 00:38
夜叶
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:104
专家分:189
注 册:2011-5-7
收藏
得分:0 
递归真难
2011-05-10 07:23
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
程序代码:
以下是引用诸葛修勤在2011-5-10 00:26:23的发言:

这程序写的很好啊

#include"stdio.h"

#define SWAP(a,b,c) {(c)=(a); (a)=(b); (b)=(c);}

void perm(int *list,int i,int n);

int main()
{
    int arry[5]={1,2,3,4,5};
    perm(arry,0,4);

    return 0;
}

void perm(int *list,int i,int n)
{
    static int counter;
    int j,temp;
    if(i==n)
    {//当n个数排列好之后 进行打印   
        printf("%d\t", ++counter);
        for(j=0; j<=n; j++)
        {//这里是循环打印一个数组  的长度 下标从零开始 到 n(长度减一)  //为什么n会减一呢?n不是一直都是4吗?所以始终会打印数组中5个元素出来!
            printf("%d", list[j]);
        }

        printf("\n");
    }
    else
    {
        for(j=i;j<=n;j++)
        {
            1)SWAP(list,list[j],temp);
            2)perm(list,i+1,n);
            3)SWAP(list,list[j],temp);//这里的三句用的很好  不知道是谁写的 有点喜欢他啦  这里和中断的机制极为相像
                                          //首先1)可以理解成是现场保护为 这只是从结构上说 实际上这里 就相当于中断服务程序啦 即你实际要做的事情啦
                                          //2)这里可以理解为中断嵌套 即进入下一个中断 也就是说下一级的中断的优先级比上一级的高 所以先得以运行
                                          //3)这里就是现场恢复啦  实际上做的事情的确是把交换后的两个数据的再次交换 恢复到交换之前的状态 即1)状态之前
        }
    }
}

每当进入else的时候 j的初始状态值是设置为i的 所以进入for中第一次的交换是自身和自身交换 原程序运行的是一句逗号表达式 



因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-05-10 08:00
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
回复 11楼 诸葛修勤
再请教几个问题,函数满足递归终止条件,然后输出1,2,3,4,5 对吧?然后返回到上一级对4,5进行全排列,那么返回到上一级的时候,函数的执行顺序是从头开始执行直到结束,还是执行递归入口后面的语句?返回上一级的时候,i是不是相应减一?

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-05-10 08:10
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
回复 12楼 夜叶
再难也要学下去!

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-05-10 08:14
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
回复 14楼 liangjinchao
perm(list,i+1,n);
这里i的值并没有改变 只是i+1作为实参 传进去   对于每一层来说 i值是不变的
所以递归推出的时候 i的值不需要减掉1
2011-05-10 12:20
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:0 
!!!

最基础的往往是你最容易忽略的!
2011-05-10 12:28
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
回复 17楼 于祥

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-05-10 12:43
wzp630147841
Rank: 1
来 自:山西太原
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-5-10
收藏
得分:0 
2011-05-10 22:14
利剑长风
Rank: 2
等 级:论坛游民
帖 子:11
专家分:32
注 册:2011-12-18
收藏
得分:0 
遇见递归脑壳就痛啊
2012-02-22 10:17
快速回复:【木有人?】递归全排列问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014818 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved