正文

算法设计之递归法(3)2007-10-06 19:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/29927.html

分享到:

练习: 1.  小猴吃枣:小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?   2.  MyCathy函数定义如下: x – 10  ,    x > 100 M(x)= {    M(M(x+11)), x <= 100 分别用递归和非递归方式编写函数计算给定x的M(x)的值。 3.  使用递归函数表达欧几里德算法。     4.  设对于给定的x和系数a[i]求下列n阶多项式的值: n阶多项式:Pn(x) = an.x^n + a(n-1).x^(n-1) + ... + a1.x + a0 函数接口:double Poly(double coeff[], int n, double x);     参考程序: 1. 算法分析:可用递归方法,返回第n天的桃子数量。   递归公式:F(n) = 1, n= 10; F(n) = (F(n+1)+ 1)*2, n= 10; #include <stdio.h>   int Peach(int n);   int main(void) {     int i;     for (i=1; i<=10; i++)         printf("第%d天这堆枣子有%d个\n", i, Peach(i));        getchar();     return 0;   }     int Peach(int n) {     if (n < 10)         return (Peach(n+1) + 1) * 2;     else         return 1;     }   2.递归算法: int M(int x) {     if (x > 100)         return x - 10;     else     return M(M(x + 11)); } 非递归算法: int M(int x) {     int level = 1;       if (x > 100)         return x - 10;     else     {         level++;         x += 11;     }     while (level > 0)     {         if (x > 100)         {             level--;             x -= 10;         }         else         {             level++;             x += 11;         }     }     return x; }   3. int Gcd(int m, int n)//欧几里德方法,递归 {     if (m<0 || n<0) //预防错误         return 0;     if (n == 0)         return m;        return Gcd(n, m%n); }   4. #include<stdio.h>   double Poly(double coeff[], int n, double x); double Horner2(double coeff[], int n, double x); double Horner(double coeff[], int max, int n, double x);   int main() {     double a[1000] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     int n = 5;     double x = 3.5;         printf("%f\n", Poly(a, n, x));     printf("%f\n", Horner(a, n, n, x));         getchar();     return 0;       } //1. 一般计算方法 double Poly(double coeff[], int n, double x)//计算n次多项式的值,coeff[0:n]为多项式的系数 {     int i;     double y = 1;     double value = coeff[0];         for (i=1; i<=n; i++) //n循环, 累加下一项     {        y *= x; //一次乘法                 value += y * coeff[i]; //一次加法和一次乘法     }         return value; } //3n次基本运算   //2. Horner法则(秦九韶方法):P(x)=((cn*x+cn-1)*x+cn-2)*x+···)*x+c0 double Horner2(double coeff[], int n, double x) {     int i;     double value = coeff[n];         for(i=1; i<=n; i++) //n循环         value = value * x + coeff[n-i]; //一次加法和一次乘法         return value; } //2n次基本运算   //3.递归算法 /* 多项式求值的递归算法 n阶多项式:Pn(x) = an.x^n + a(n-1).x^(n-1) + ... + a1.x + a0 利用Horner法则,把上面公式改写成:     Pn(x) = an.x^n + a(n-1).x^(n-1) + ... + a1.x + a0          = ((...((((an)x + a(n-1))x + a(n-2))x + a(n-3))x...)x + a1)x + a0 */ double Horner(double coeff[], int max, int n, double x) {     double value;         if (n == 0)         value = coeff[max-n];     else         value = Horner(coeff, max, n-1, x) * x + coeff[max-n];       return value; } //2n次基本运算   //也可以写成 double Horner(double coeff[], int max, int n, double x) {     double coeff[max-n];         if (n > 0)         value = Horner(coeff, max, n-1, x) * x + coeff[max-n];       return value; } //2n次基本运算

阅读(5050) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册