2016-11-05 9 views
-1

Пожалуйста, кто-нибудь может помочь мне с рекурсивной функцией для поиска LCM массива из int. Вызов функции будет: int LCM(int * arr, int length){} Пожалуйста, кто-нибудь может мне помочь.Рекурсивная функция для LCM в C++ с использованием нескольких номеров

+0

Да, все они будут натуральные числа подсчета. – user3832668

ответ

-1
int lcm(int a,int b){ 

    static int temp = 1; 

    if(temp % b == 0 && temp % a == 0) 
     return temp; 
    temp++; 
    lcm(a,b); 

    return temp; 
} 
+0

Как бы я тогда преобразовать это так, чтобы он принял массив ints, где есть? – user3832668

0

Вы отметили это как C++. Вот один из возможных способов C++, как это сделать, с std :: vector.

class T435_t 
    { 
    private: 
     std::vector<int> iVec; 

     void show(std::string label) 
     { 
      std::cout << label << std::endl; 
      for (auto iv : iVec) 
       std::cout << " iVec " << std::setw(6) << iv << std::endl; 
      std::cout << std::endl; 
     } 

    public: 

     T435_t() // : std::vector<int> iVec - default ctor ok 
     { 
     } 

     ~T435_t() { } 

     int exec() 
     { 
      // test data 
      iVec.push_back(5); 
      iVec.push_back(10); 
      iVec.push_back(15); 
      iVec.push_back(20); 
      iVec.push_back(25); 

      show("\n ---- ---"); 

      int retVal = LCM(1); // start tmp at 1 

      std::cout << " LCM " << std::setw(6) << retVal << std::endl; 

      return(0); 
     } 

    private: 

     inline bool componentOf (int tmp) 
     { 
      size_t count = 0; 
      for (auto iv : iVec) 
      { 
       if (0 == (tmp % iv)) 
        ++count; // how many elements of vec are component 
      } 
      return (count == iVec.size()); // when all are 
     } 

     // recursion 
     int LCM(int tmp) 
     { 
      if (componentOf(tmp)) // recursion termination clause 
       return (tmp); 

      return (LCM (++tmp)); // probably tail recursion with -O3 
     } 
    }; 


int main(int argc, char* argv[]) 
{ 
    std::cout << "argc: " << argc << std::endl; 
    for (int i=0; i<argc; i+=1) std::cout << argv[i] << " "; 
    std::cout << std::endl; 

    setlocale(LC_ALL, ""); 
    std::ios::sync_with_stdio(false); 

    T435_t t435; // C++ uses classes! 
    int retVal = t435.exec(); 

    std::cout << "\nFINI " << std::endl; 
    return(retVal); 
} 

Выход:

---- --- 
iVec  5 
iVec  10 
iVec  15 
iVec  20 
iVec  25 

LCM  300 

Вывод с 5 и 6 закодирована в iVec

---- --- 
iVec  5 
iVec  6 

LCM  30 
+0

Обратите внимание, как использование вектора упрощает код ... подсчитывает и вставляет индекс, все позаботились о вас. –

+0

Обратите внимание, что использование вектора и «for (auto iv: iVec)» упрощает сканирование содержимого iVec, как для «show()», так и для метода «componentOf()». –

+0

Обратите внимание на то, как рекурсивный код «LCM()» имеет полный доступ к любому атрибуту данных класса ... например, мне не нужно было передавать «массив» ptr и длину через рекурсию, LCM() просто обращался к экземпляры iVec. Мне также не нужно было пропускать «tmp» через рекурсию, но я подумал, что это больше похоже на нее. –