【习题2】
霍纳规则 Horner's method:
用来简化朴素多项式的求值,在中国叫秦九韶算法。
霍纳规则是一种将一元n次多项式求值问题转化为n个一次式算法。其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,霍纳规则依然是最优的算法规则。
霍纳规则是采用最少的乘法运算策略,求多项式A(x) = a
nx
n+ a
n-1x
n-1+...+ a
1x + a
0在x0处的值,该规则是A(x
0)=(...((a
nx
0+ a
n-1)x
0+...+ a
1)x
0+ a
0)
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_SIZE 101
float horner(float [], int, int, float);
int main()
{
float coefficient[MAX_SIZE];
/*输入多项式的项数*/
printf("Enter the number of polynomial terms to generate: ");
int n;
scanf_s("%d", &n); /* VS2013等版本中使用scanf_s(),VC6.0中使用scanf(),下同*/
if(n < 1 || n > MAX_SIZE)
{
fprintf(stderr, "Improper value of n\n");
exit(EXIT_FAILURE);
}
srand((unsigned)time(NULL));
int i;
for(i = 0; i < n; i++)
{
/*随机生成n个系数并存在数组coefficient里*/
coefficient[i] = rand() / (float)(RAND_MAX / 100);
printf("%lf\t", coefficient[i]);
}
/*输入多项式的自变量值*/
printf("\nEnter the value of x: ");
float x;
scanf_s("%f", &x);
/*多项式结果*/
double result = 0;
result = horner(coefficient, n, 0, x);
printf("\nResult of this polynomial in %f is %f\n", x, result);
return 0;
}
float horner(float list[], int n, int i, float x)
{
if(i == n - 1)
return list[n-1]; /*递归出口*/
else
return horner(list, n, i + 1, x) * x + list[i]; /*递归过程*/
}
【习题3】
取巧:假设有n个布尔变量,那就直接把大于零且不大于2^n的整数,按二进制输出,就是所有可能,1代表真,0代表假。
但目的是要练习递归函数。下面这个例子是找个地方先存起来,递归完毕了统一打印。
#include <stdio.h>
#define Max_size 100 /*最多可以使得n=100 */
void value(char *, int i, int n);
void main(void)
{
int n, k;
char list[Max_size]; /*用字符数组存储字符,‘T’代表true, ‘F’代表false*/
printf("input the number of Booleans: \n");
scanf("%d", &n);
if (n<1 || n>Max_size)
{
printf("\nImproper number n!\n");
exit(1);
}
for(k=0; k<n; k++)
{
list[k] = 'T';
}
value(list, 0, n-1);
}
void value (char *list, int i, int n)
{
int j;
if (i==n+1) /*已经递归完毕, 输出序列*/
{
for (j=0; j<=n; j++)
{
printf("%c", list[j]);
}
printf(" ");
}
else {
list[i] = 'T';
value(list, i+1, n);
list[i] = 'F';
value(list, i+1, n);
}
}
【习题4】
有递归什么事情么?
#include "stdio.h"
int main()
{
int x,y,z,max,min;
scanf("%d%d%d",&x,&y,&z);
if(x>y){
max=x;
min=y;
}
if(z>max) max=z;
if(min>z) min=z;
y=x+y+z-max-min;
x=max;
z=min;
printf("从大到小排序:%d %d %d\n",x,y,z);
}