在高中数学中,我们学习过数列。我们知道数列有两种表示方法,一种称为通项公式,即项an和项数n的关系;还有一种称为递推公式,即后一项an和前一项a(n-1)之间的关系。通项公式能够一下子把an求解出来,而递推公式则要根据首项的值多次推导才能把第n项的值慢慢推导出来。如果有一个较为复杂的数列的递推公式,人工将其转化为通项公式或者将其的每一项求出实在非常麻烦,那么我们能不能直接把这个递推公式交给计算机,让它来为我们求解呢?
我们说过,在任何一个函数体内不能出现其它函数的定义。但是,在任一个函数体内可以调用任何函数,包括该函数本身。直接或者间接地在函数体内调用函数本身的现象称为函数的递归。正是函数的递归,能够帮我们解决递推公式求解的问题。
现有一个数列,已知an=2*a(n-1)+3,并且a1=1,求解a1到a8的各项值。我们把数列问题转化为函数问题,认为an=f(n),a(n-1)=f(n-1)……于是f(n)=2*f(n-1)+3,f(n-1)=2*f(n-1-1)+3……直到f(1)=1。我们根据前面的描述写出以下程序:(程序6.6)
#include "iostream.h"
int f(int n);//看作数列an
int main()
{
for (int i=1;i<=8;i++)
{
cout <<"f(" <<i <<")=" <<f(i) <<endl;//输出a1到a8的值
}
return 0;
}
int f(int n)
{
if (n==1)
{
return 1;//告知a1=1
}
else
{
return 2*f(n-1)+3;//告诉电脑f(n)=2*f(n-1)+3
}
}
运行结果:
f(1)=1
f(2)=5
f(3)=13
f(4)=29
f(5)=61
f(6)=125
f(7)=253
f(8)=509
我们说过,在任何一个函数体内不能出现其它函数的定义。但是,在任一个函数体内可以调用任何函数,包括该函数本身。直接或者间接地在函数体内调用函数本身的现象称为函数的递归。正是函数的递归,能够帮我们解决递推公式求解的问题。
现有一个数列,已知an=2*a(n-1)+3,并且a1=1,求解a1到a8的各项值。我们把数列问题转化为函数问题,认为an=f(n),a(n-1)=f(n-1)……于是f(n)=2*f(n-1)+3,f(n-1)=2*f(n-1-1)+3……直到f(1)=1。我们根据前面的描述写出以下程序:(程序6.6)
#include "iostream.h"
int f(int n);//看作数列an
int main()
{
for (int i=1;i<=8;i++)
{
cout <<"f(" <<i <<")=" <<f(i) <<endl;//输出a1到a8的值
}
return 0;
}
int f(int n)
{
if (n==1)
{
return 1;//告知a1=1
}
else
{
return 2*f(n-1)+3;//告诉电脑f(n)=2*f(n-1)+3
}
}
运行结果:
f(1)=1
f(2)=5
f(3)=13
f(4)=29
f(5)=61
f(6)=125
f(7)=253
f(8)=509
这个是不是跟C#的思路一样?