标签:blog http strong os 数据 2014
线性递归,就是大家平常说的递归,线性递归函数的最后一步操作不是递归操作,将最终条件代入计算。在每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中,当数据量很大的时候,会造成栈溢出。
尾递归,也就是线性迭代,尾递归函数的最后一步操作是递归,也即在进行递归之前,把全部的操作先执行完,这样的好处是,不用花费大量的栈空间来保存上次递归中的参数、局部变量等,这是因为上次递归操作结束后,已经将之前的数据计算出来,传递给当前的递归函数,这样上次递归中的局部变量和参数等就会被删除,释放空间,从而不会造成栈溢出。但是很多编译器并没有自动对尾递归优化的功能,也即当编译器判断出当前所执行的操作是递归操作时,不会理会它究竟是线性递归还是尾递归,这样也就不会删除掉之前的局部变量和参数等。另外,尾部递归一般都可转化为循环语句。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多
吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?
#include <iostream> using namespace std; int AllSum(int day) { if(day==10) return 1; else return 2*AllSum(day+1)+2; } int main() { int sum=AllSum(1); cout<<"第一天共摘了"<<sum<<"个桃子"<<endl; return 0; }
#include<iostream> using namespace std; int AllSum(int day,int total) { if(day==10) return total; else return AllSum(day+1,total*2+2); } int main() { int sum=AllSum(1,1); cout<<"第一天共摘了"<<sum<<"个桃子"<<endl; return 0; }
运行结果截图:
标签:blog http strong os 数据 2014
原文地址:http://www.cnblogs.com/coderchuanyu/p/3840198.html