简单实例
实例1、递归实现数字的倒序输出
#include <iostream> using namespace std; int T(int n){ if(n<10) cout<<n; else{ cout<<n%10; T(n/10); } } int main(){ int n; cin>>n; T(n); }
实例2、递归实现10进制转8进制
#include <iostream> using namespace std; int T(int n){ if(n<8) return n; else return T(n/8)*10+n%8; } int main(){ int n; cin>>n; cout<<T(n); }
递归的简单理解
1、如何确认递归部在调用函数本身时的参数。递归分别由递归部和终止部组成,难点在于确定递归部。确认递归部的第一步是确认“子问题”,然后再通过子问题的分析确定递归函数的参数。在实例2里面递归部里面函数的第一个子问题是:“n%8得出余数a1”,下一个子问题是将n/8的值继续求余数a2,下下个子问题是将n/8的值继续求余数a3、、、,直到n<8的时候进入到终止部。故可以确定递归部的参数为n/8。
2、递归的执行顺序。在实例二中,按照常规的思维,一般我们会认为是先求解a1(子问题中n%8得出第一个余数),但是由于递归部的return的值是依赖下一个子问题的解,而下一个子问题是依赖下下个子问题的解,以此类推,直到进入到终止部的子问题,才能将所有问题解决。故一般递归的执行的顺序是从终止部开始的。
3、递归执行的顺序不一定会从终止部开始。在实例一“递归实现数字的倒序输出”,代码的执行顺序是“从递归部开始的”,因为“cout<<n%10;”不依赖于调用本身的函数。以输入数字“10086”为例,首先输出的是n%10为6,然后再进入下一个子问题输出下一个数字8,以此类推,倒序输出数字。故可以简单理解代码的执行顺序是从递归部开始的。