递归要点:
1. 基本情况有返回值;
2. 复杂问题逐渐简单化,最后转化为基本情况。
例子1-回文:
基本情况:字符串长度为0或者1时,返回true;
字符串长度大于1时,如果第一个字符和最后一个字符相等时,问题转化为从第二个字符到倒数第二个字符之间的字符串是否为回文的更简单问题,否则,返回false。
substr函数第一个参数为字符串的起始位置,第二个参数为从起始位置开始所要截取的字符串长度。
例子2-斐波那契数列:
基本情况:n为0时,返回0;n为1时,返回1。
n>1时,返回上一个它的前一个和前前一个斐波那契数之和的更简单问题。
附C++代码(含测试函数):
#include <string>
#include <iostream>
using namespace std;
bool IsPalindrome(string str)
{
if(str.length()==0||str.length()==1)
return true;
else if(str[0]==str[str.length()-1])
IsPalindrome(str.substr(1,str.length()-2));
else
return false;
}
int Fibonacci(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return Fibonacci(n-1) + Fibonacci(n-2);
}
void TestIsPalindrome()
{
string a = "CSDN";
cout<<"Is 'CSDN' Palindrome? \nAnswer:";
if(IsPalindrome(a))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
a = "CSDNNDSC";
cout<<"Is 'CSDNNDSC' Palindrome?\nAnser:";
if(IsPalindrome(a))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
a = "CSDNNDS";
cout<<"Is 'CSDNNDS' Palindrome?\nAnser:";
if(IsPalindrome(a))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
void TestFibonacci()
{
int a = 3;
cout<<"Fibonacci第3个数的值是:";
cout<<Fibonacci(a)<<endl;
a = 5;
cout<<"Fibonacci第5个数的值是:";
cout<<Fibonacci(a)<<endl;
a = 30;
cout<<"Fibonacci第30个数的值是:";
cout<<Fibonacci(a)<<endl;
/* a = 50;
cout<<"Fibonacci第50个数的值是:";
cout<<Fibonacci(a)<<endl;*/
}
int main()
{
TestIsPalindrome();
TestFibonacci();
return 0;
}
问题1:Fibonacci函数如果输入的是一个负数,结果会是怎样,如何解决?
问题2:TestFibonacci函数中注释的部分执行时,计算机需要很长时间甚至不能得到结果,为什么?如何解决?