递归的有关问题 怎样跑的
递归的问题 怎样跑的?
例如 输入 3 2 输出 12 13 23 输入3 输出 123 132 213 231 312 321这个combination函数是怎样跑的? 我怎么感觉 只能跑出一个数组(12) 然后就返回了,,下面的 2个数组 是怎样循环输出的?
------解决方案--------------------
在递归函数递归的地方打上断点(F9),然后按F5调试运行,在Watch窗口填写某个变量的名字,即可看到该变量当前的值
------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
#include<iostream>
using namespace std;
void main()
{
void combination( int m, int n, int start= 1, int deep= 0);
void permutation( int m, int deep= 0);
int m,n;
cin >>m >>n;
combination( m, n);
cin >>m;
permutation( m);
}
void permutation( int m, int deep= 0)//排列
{
static int Array[1000];
static bool Flag[1000];
if ( deep == m) //递归结束判断
{
for( int i= 0; i< deep; i++)
cout<< Array[i];
cout<< " ";
return ;
}
for (int i= 1; i <=m ;i++)
{
if( Flag[i]== true)
continue; //该数用过不用
Array[deep]= i;
Flag[i]= true;
permutation( m, deep+1);
Flag[i]= false;
}
if( deep == 0) //递归程序最终结束时换行
cout<< endl;
}
void combination( int m, int n, int start= 1, int deep= 0)//组合
{
static int Array[1000];
if( n == 0) //递归结束判断
{
for( int i= 0; i < deep; i++) //输出
cout<< Array[i];
cout<< " ";
return; //跳出递归
}
for( int i= start; i <= m-n+1; i++)
{
Array[deep]= i;
combination( m, n-1, i+1, deep+1);
}
if( deep == 0)//递归程序最终结束时换行
cout<< endl;
}
例如 输入 3 2 输出 12 13 23 输入3 输出 123 132 213 231 312 321这个combination函数是怎样跑的? 我怎么感觉 只能跑出一个数组(12) 然后就返回了,,下面的 2个数组 是怎样循环输出的?
递归
------解决方案--------------------
在递归函数递归的地方打上断点(F9),然后按F5调试运行,在Watch窗口填写某个变量的名字,即可看到该变量当前的值
------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出