标题:关于此程序的递归模式的疑问
只看楼主
萌新想学cpp
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-10-27
结帖率:0
已结贴  问题点数:20 回复次数:6 
关于此程序的递归模式的疑问
全排列,用递归实现。
想问下在一次排列结束之后(达到递归边界后,这个程序是怎样开始下一次排列的)
#include<iostream>
using namespace std;
int fun1(int n,int* A,int cur){
    if(cur==n){
        for(int i=0;i<n;i++) cout<< A[i];
    }else{
        for(int i=0;i<n;i++){
            int ok=1;
            for(int j=0;j<cur;j++){
                if(A[j]==i+1){
                    ok=0;      
                }
            }
            if(ok){
            A[cur]=i+1;
            fun1(n,A,cur+1);
        }
        }
        
    }
}                                                                              
int A[500]={0};
int main(){
    int n;
    cin>>n;
    fun1(n,A,0);
}
搜索更多相关主题的帖子: 递归 模式 排列 int for 
2018-10-27 23:27
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:20 
所有的递归里都肯定会有一个递归退出的条件
一般来说, 第一反应就是去找 if
在这段程序中, 当进入 if 分支就代表完成
否则进入 else, 做完 else 里该做的就开始下一次递归 fun1(n,A,cur+1);
2018-10-28 10:14
萌新想学cpp
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-10-27
得分:0 
回复 2楼 Jonny0201
那么在执行了if之后程序就应该结束了
但这个程序会多次进入if
这怎么解释呢?
2018-10-28 16:55
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
回复 3楼 萌新想学cpp
你 debug 之后看一下
进入第一个 if 之后还不会再次进入这个 if
2018-10-28 18:23
萌新想学cpp
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-10-27
得分:0 
回复 4楼 Jonny0201
会的,这个程序就是算法竞赛入门经典里的标程。
但我不理解这个程序的变量cur是如何归零的。
您能帮我运行下看看吗?
2018-10-28 18:51
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
回复 5楼 萌新想学cpp
也不知道你能不能看懂
不是你想象的那样的, 我觉得你完全没有理解
我假设 n = 3
那么程序就是 func(3, A, 0)
注意这里的 0
但是你看一下函数里, 都是 cur + 1, 并没有出现 cur - x
所以 0 肯定是函数刚进来的时候来的
你再去看函数里面的 if(ok) 那段, 那段里面 cur + 1 之后就重新开始执行了. 注意, 这个时候先前的循环并没有执行完, 就去重新执行这个函数了, 并且 cur + 1
因为 n 等于 3, 所以全排列里面的数字再怎么大也不可能大过 3, 所以不管重新执行几遍, 总有执行完的时候
等 cur = x, cur = x - 1...这些执行完的时候, 是不是回到了 cur = 0

你拿一张纸, 把每一次执行的结果都写出来, 估计你就可以理解了
2018-10-28 21:14
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
回复 5楼 萌新想学cpp
递归是可以被改成循环的
你试着按照书里面的算法改成循环
你再去理解这段递归
或者你找一些简单的递归理解一下再看看这段
递归这种东西我实在是讲不清楚
2018-10-28 21:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490748-1-1.html




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

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