爬楼梯问题的递推解法和尾递归解法
一、尾递归解法
如果使用一般的递归的话,如果数字一大,就会花费比较长的时间,但是使用尾递归就会快很多。
/************************************************************
*函数名:recursion_way
*主要功能:对于输入的台阶数,通过尾递归的方法,输出可能存在的爬楼梯的方法
*输入参数说明:三个参数,第一个参数为台阶数,第二个为台阶数为1时的值,此题为1,第三个是台阶数为2时的值,此题为2.
*输出说明:无输出
*返回值:返回一个整数,类型为unsigned long long.
case:cout<<recursion_way(10,1,2)<<endl;
会输出:89
***************************************************************/
unsigned long long recursion_way(int n,unsigned long long acc, unsigned long long cal)
{
if (n == 1)
return acc;
else if (n == 2)
return cal;
else
return recursion_way(n - 1, cal, acc + cal);//尾递归实现
}
二、递推解法
关键是找出递推的公式
/************************************************************
*函数名:general_way
*主要功能:对于输入的台阶数,通过递推公式的计算,输出可能存在的爬楼梯的方法
*输入参数说明:一个int类型的值,表示台阶数
*输出说明:无输出
*返回值:返回一个整数,类型为unsigned long long.
case:cout<<general_way(10)<<endl;
会输出:89
***************************************************************/
unsigned long long general_way(int n) {
if (n == 1 || n == 2) {
return n;
}
//利用递推公式和循环计算
else {
unsigned long long first = 1;
unsigned long long second = 2;
unsigned long long temp = 0;
for (int i = 3; i < n + 1; i++) {
temp = first + second;
first = second;
second = temp;
}
return temp;
}
}