用于递归地计算功率的编程不计算完成的多重数量

时间:2016-02-07 18:55:02

标签: c++ recursion

我有一项任务要求我使用三种不同的方法计算能力,第二种和第三种方法需要递归。在 T power2(T x, unsigned int n, unsigned int& mults) 我需要计算每次乘法发生时出现的乘法次数(由恶意表示),但由于某种原因,程序不会计算出现的恶意! (注意:我不能在这个项目中使用pow()函数。)

#include <iostream>
using namespace std;

// function prototypes


template <class T>
T power1(T x, unsigned int n, unsigned int& mults);

template <class T>
T power2(T x, unsigned int n, unsigned int& mults);

template <class T>
T power3(T x, unsigned int n, unsigned int& mults);

template <class T>
void printReport(T base, unsigned int pow, 
             T result1, T result2, T result3,
             unsigned int mults1, unsigned int mults2, 
             unsigned int mults3);

/**
 * The usual main function.
 * 
 * It computes the powers 2<sup><em>i</em></sup> for
 * <em>i=</em>0,1,2,..,32 via all three methods, reporting the number
 * of multiplications needed for each method.  (Note what happens for
 * 2^32.)  It then does likewise for 0.5<sup><em>i</em></sup>, but now
 * with <em>i=</em>0,1,2,...64
 *
 */



int main()
{
   unsigned int mults1, mults2, mults3;
   cout << "Test for integer base:\n";
   for (unsigned int pow = 0; pow <= 32; pow++) {
      unsigned int base = 2;
      unsigned int result1 = power1(base, pow, mults1);
      unsigned int result2 = power2(base, pow, mults2);
      unsigned int result3 = power3(base, pow, mults3);      
      printReport(base, pow, result1, result2, result3, 
                  mults1, mults2, mults3);
   }
   cout << "\nTest for floating-point base:\n";
   for (unsigned int pow = 0; pow <= 64; pow++) {
      double base = 0.5;
      double result1 = power1(base, pow, mults1);
      double result2 = power2(base, pow, mults2);
      double result3 = power3(base, pow, mults3);      
      printReport(base, pow, result1, result2, result3, 
                  mults1, mults2, mults3);
   }
 }

 /**
 * Iterative function to compute a power <em>x<sup>n</sup></em>.
 *
 * @param x : variable represents the base 
 * @param n : variable represents power
 * @param mults : variable to represent number of calculations 
 * @return ???
 * @pre n >= 0
 * @post mults is ???
 */


template <class T>
T power1(T x, unsigned int n, unsigned int& mults)
{
    mults = 0;
    if (n == 0)
      return 1;
    else if (n == 1)
      return x;
    else 
{   mults=n-1;
    for (int i= 0; i<= n; i++)
    {         
        int result;
        result*=x;
        return result;     
    }
}   
}

/**
 * PROBLEM IS IN THIS FUNCTION BELOW!!!!
 */
template <class T>
T power2(T x, unsigned int n, unsigned int& mults)
{
   mults = 0;
   if (n == 0) return 1;
   else if (n== 1) return x;   
   else
   {

       mults = n-1;
       return x * power2(x, n-1, mults);   
   }


}

/*
* Put your comments for power3 here
 */


template <class T>
T power3(T x, unsigned int n, unsigned int& mults)
{
   if (n == 0) 
   {
       mults = 0;
       return 1;
   }
   else if (n == 1)
   {
       mults=0;
       return x;
   }  
   else if (n%2 ==0) //if n is even
   {
       mults++;
       return power3(x, n/2, mults)*power3(x, n/2, mults);
   }
   else 
   {
       return 5;
        // seg fault is here
       //mults++;
       //return x*power3(x,(n-1/2), mults)*power3(x,(n-1/2), mults);
   }

}

/**
 * Report the results of three different exponentiation calculations.
 *
 * To give you practice using doxygen, I'll let you fill in the rest
 * of this comment block yourself.
 */

template <class T>
void printReport(T base, unsigned int pow, 
                 T result1, T result2, T result3,
                 unsigned int mults1, unsigned int mults2, 
                 unsigned int mults3)
{
   cout << base << "^" << pow << " = ";
   if (result1 == result2 && result2 == result3)
       cout << result1 << ": ";
   else
   cout << "(" << result1 << ", " << result2 << ", " << result3 
        << ") [ERROR!]: ";
   cout << "mults1 = " << mults1 << ", mults2 = " << mults2
        << ", mults3 = " << mults3 << endl;
}

0 个答案:

没有答案