霍纳规则(C/C++,Scheme)

一、背景

霍纳(Horner)规则是采用最少的乘法运算策略,来求多项式

A(x)=anxn+an?1xn?1+...+a1x+a0

在x0处的值。

该规则为

A(x0)=(...((anx0+an?1)x0+...+a1)x0+a0)

二、分析

如果光看着式子或许会有点烦躁,不妨手动设定几个值到式子中去来手工运算一番,这样一来也会有些亲身的理解。

通过分解我们注意到,从右往左来看,每一个小式子都是如此:

something?x0+ai

三、代码

C语言版

#include <stdio.h>
#include <stdlib.h>

int hornerRule(int list[],int m,int x0);

int main()
{
    int m,x0;
    printf("Enter an integer (length of list): \n");
    scanf("%d",&m);
    int list[m];
    printf("Enter some integers for list: \n");
    int i;
    for(i=m-1;i>=0;i--)
    {
        scanf("%d",&list[i]);
    }
    printf("Enter an integer for x0: \n");
    scanf("%d",&x0);
    printf("%d",hornerRule(list,m,x0));

    return 0;
}

int hornerRule(int list[],int m,int x0)
{
    if(m<=1)
        return list[0];
    else
        return list[0]+(hornerRule(list+1,m-1,x0))*x0;
}

C++语言版

#include <iostream>

using namespace std;

int hornerRule(int list[],int m,int x0);

int main()
{
    int m,x0;
    cout<<"Enter an integer (length of list):"<<endl;
    cin>>m;
    int list[m];
    cout<<"Enter some integers for list:"<<endl;
    for(int i=m-1;i>=0;i--)
    {
        cin>>list[i];
    }
    cout<<"Enter an integer for x0:"<<endl;
    cin>>x0;

    cout<<hornerRule(list,m,x0);

    return 0;
}

int hornerRule(int list[],int m,int x0)
{
    if(m<=1)
        return list[0];
    else
        return list[0]+(hornerRule(list+1,m-1,x0))*x0;
}

四、测试

五、进阶

(PS:博主有一段时间没有碰Scheme有点忘了,所以下面的代码可能有些……粗糙)

关于Scheme可以看这里:

专栏:SICP练习

专栏:Scheme归纳

(define (Horner list m x0)
  (define (Horner-iter ls n)
    (if (<= n 1)
    (car ls)
    (+ (car ls) (* (Horner-iter (cdr ls) (- n 1)) x0))))
  (Horner-iter list m))

(define list ‘(1 2 1 0 3 1))
;Value: list

(Horner list 6 10)
;Value: 130121
时间: 2024-07-30 18:06:57

霍纳规则(C/C++,Scheme)的相关文章

第一章 基本概念_利用霍纳规则求多项式的值(递归)

#include <stdio.h>  #include <stdlib.h>  #define LEN 3  int hornor(int [],int,int);  int main()  {     int a[3]={1,2,3};//数组表示多项式的系数     int x=2;//多项式的自变量值     int result=0;//存放结果     result = hornor(a,0,2);  //3*2^2+2*2^2+1*2^0              

霍纳规则解决多项式的求值问题

霍纳规则用来简化朴素多项式的求值.它将一元n次多项式的求值问题转化为n个一次式. 霍纳规则是采用最少的乘法运算策略,求多项式A(x) = anxn+ an-1xn-1+...+ a1x + a0在x0处的值,该规则是A(x0)=(...((anx0+ an-1)x0+...+ a1)x0+ a0) 1 #include<stdio.h> 2 3 int horner(int a[], int x, int n); 4 5 int main() 6 { 7 int n; 8 scanf(&quo

数学之路-python计算实战(3)-霍纳法则

假设有n+2个实数a0,a1,-,an,和x的序列,要对多项式Pn(x)= anx ^n+a(n-1)x^(n-1)+-+a1x+a0求值,直接方法是对每一项分别求值,并把每一项求的值累加起来,这种方法十分低效,它需要进行n+(n-1)+-+1=n(n+1)/2次乘法运算和n次加法运算.有没有更高效的算法呢?答案是肯定的.通过如下变换我们可以得到一种快得多的算法,即Pn(x)= anx ^n+a(n-1)x^(n-1)+-+a1x+a0=((-(((anx +an-1)x+an-2)x+ an-

【算法设计与分析基础】18、霍纳法则

产生随机数 package cn.xf.algorithm.ch02; import java.util.ArrayList; import java.util.List; /** * 生产随机数 * @author xiaof * */ public class Random { /** * 生产一个随机数的数列 * @param n 生成n个数列 * @param m 数据在0和m-1之间 * @param seed 随机初始种子 * @param a 参数 * @param b 参数 *

霍纳法则(Horner&#39;s rule)

卡在hdu 1402 的高精度乘法了,要用FFT(快速傅里叶变换),然后看到了这个霍纳法则,顺便就写下来了. 霍纳法则:求多项式值的一个快速算法. 简单介绍: 假设有n+2个数 , a0,a1,a2,a3,--an 和x组成的一个多项式,形式如下:   a0*x^0+a1*x^1+a2*x^2+a3*x^3+--an*x^n   ,通常都是一项一项的求和然后累加,这样的话要进行n* (n+1)/2 次乘法运算 和 n 次加法运算 , 而霍纳法则就是一个改进的一个算法.通过变换得到如下式子: ((

霍纳法则

计算机科学中,有一些关于多项式求值的问题.对于多项式求值问题,我们最容易想到的算法是求出每一项的值然后把所求的值累加起来,这种算法的时间和空间效率都不高,对于数据规模不大的题目来说由于其直观.简单很容易被大家采纳,可一旦数据规模过大时,这种算法就显得无能为力了,下面介绍一种解决这类求值问题的高效算法――霍纳法则.在中国,霍纳法则也被称为秦九韶算法. 霍纳法则最重要的用途:为多项式求值提供了一个高效的方法.算式转化如下: 实例如下: 使用霍纳法则,步骤如下: 1,建立二维表格,将公式的系数填入第一

用于多项式计算的霍纳方法

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代 这两个概念也许很多童鞋依旧分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧. 斐波那契数的定义: f0=0 f1=1 fi=fi?1+fi?2(i>1) 递归: (factorial 6) (* 6 (factorial 5)) (* 6 (* 5 (factorial 4))) (* 6 (* 5 (* 4 (factorial 3)))) (* 6 (* 5 (* 4 (* 3 (factorial 2))))) (* 6 (* 5 (* 4 (* 3 (2 (factori

nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 .而近期会加入的文章将主要是算法和Android.只是其他内容也会继续完好. About the Author 独立 Windows App 和