1.计算x的n次方
计算x的n次方有递归和递推程序。不论从时间或空间来看,自然递推优于递归。
然而,二分法则是极其优的一种方法,用在计算x的n次方完全没有问题,而且不是递归而是递推的程序。
程序中使用条件编译,以便于统计分析算法的计算量。
正解是函数power3。
-
/*
-
*
-
* 计算x的n次方程序:1.递归程序;2.非递归程序;3.二分法。
-
*
-
*/
-
#include <stdio.h>
-
//#define DEBUG
-
#ifdef DEBUG
-
int c1=0, c2=0, c3=1;
-
#endif
-
long power1(int, int);
-
long power2(int, int);
-
long power3(int, int);
-
int main(void)
-
{
-
int x = 2, n = 23;
-
printf("power1: %d %d result=%ld\n", x, n, power1(x, n));
-
printf("power2: %d %d result=%ld\n", x, n, power2(x, n));
-
printf("power3: %d %d result=%ld\n", x, n, power3(x, n));
-
#ifdef DEBUG
-
printf("c1=%d c2=%d c3=%d\n", c1, c2, c3);
-
#endif
-
return 0;
-
}
-
long power1(int x, int n)
-
{
-
#ifdef DEBUG
-
c1++;
-
#endif
-
return (n==1)?x:x * power1(x, n-1);
-
}
-
long power2(int x, int n)
-
{
-
int i;
-
long result = 1;
-
for(i=1; i<=n; i++)
-
{
-
#ifdef DEBUG
-
c2++;
-
#endif
-
result *= x;
-
}
-
return result;
-
}
-
long power3(int x, int n)
-
{
-
long res = 1L;
-
while(n) {
-
#ifdef DEBUG
-
c3++;
-
#endif
-
if(n & 1L)
-
res *= x;
-
x *= x;
-
n >>= 1;
-
}
-
return res;
-
}
2.桃子到底有多少
计算桃子有多少,有递归和递推两种方法。
-
/*
-
*
-
* 问题描述:某人某日摘若干桃子,每天卖出一半并且吃掉一个,最后一天(第n天)剩下一个。
-
* 编写一个递归程序,天数n作为参数,计算一共摘了多少桃子。
-
*
-
* 分析问题可以得出以下的递推函数:
-
* f(1) = 1 n=1
-
* f(n) = 2 * ( f(n-1) + 1 ) n>1
-
*
-
* 桃子问题算法程序:分别用递归和递推实现
-
*
-
*/
-
#include <stdio.h>
-
long peach1(int n);
-
long peach2(int n);
-
int main(void)
-
{
-
int i;
-
for(i=1; i<=10; i++)
-
printf("%d %ld %ld\n", i, peach1(i), peach2(i));
-
return 0;
-
}
-
long peach1(int n) {
-
if(n == 1)
-
return 1;
-
else
-
return 2 * (peach1(n-1) + 1);
-
}
-
long peach2(int n) {
-
if(n == 1)
-
return 1;
-
else {
-
long res = 1L;
-
while(n>1) {
-
res = 2 * (res + 1);
-
n--;
-
}
-
return res;
-
}
-
}