数值型递归有关问题的求解方法

数值型递归问题的求解方法

编写递归程序的难度较大,在掌握递归的基本概念和递归程序的执行过程之后,还应掌握编写递归程序的基本方法。编写递归程序的前提有两点。一要找出正确的递归算法,这是编写递归程序的基础;二要确定算法的递归结束条件,这是决定递归程序能否正常结束的关键。
我们可以将计算机所求解的问题分为两大类:数值问题和非数值问题。两类问题具有不同的性质,所以解决问题的方法也是不同的。
对于数值问题编写递归程序的一般方法是:建立递归数学模型,确立递归终止条件,将递归数学模型转换为递归程序。
  数值型问题由于可以表达为数学公式,所以可以从数学公式入手,推出问题的递归定义,然后确定问题的边界条件,这样就可以很容易地确定递归的算法和递归结束条件。


  例9-29:请用递归的方法计算下列函数的值:
px(x,n) = x - x2 + x3 - x4 + ...... (-1)n-1xn (n>0)
  这是一个数值型问题。函数的定义不是递归定义形式。对原来的定义进行数学变换:
  px(x,n) = x - x2 + x3 - x4 + ...... (-1)n-1xn
= x * ( 1 - x + x2 - x3 + x4 - ...... (-1)n-1xn-1 )
= x * ( 1 - ( x - x2 + x3 - ...... (-1)n-2xn-1 ) )
= x * ( 1 - px(x,n-1))
  经变换后,可以将原来的非递归定义形式转化为等价的递归定义:
x 当 n=1 时
x * ( 1 - px(x,n-1) ) 当 n>1 时
  由此递归定义,可以确定递归算法和递归结束条件。递归程序如下:
#include <stdio.h>
double px ( double x, int n )
{ if (n==1) return ( x ); /* 当n=1时,结束递归 */
else return ( x * ( 1 - px(x,n-1) ) ; /* 否则按函数的定义继续计算 */
}
main( )
{ double x; int n;
printf("Enter X and N:");
scanf ("%lf%d", &x, &n);
printf("px=%lf\n", px(x, n) ); /* 调用函数px */
}

<!--EndFragment-->