2013-12-13 6 views
-3

Существует раздел книги, которую я использую для изучения C++, в которой рассказывается об оптимизации функций.Функции оптимизации

Код выглядит следующим образом:

#include <iostream> 

using namespace std; 

int computeFactorials(int, int); 

int factorial(int); 

int main() { 
    computeFactorials(1, 5); 
    return 0; 
} 

int computeFactorials(int num, int max) { 
    cout << "Factorial of " << num << ": "; 
    cout << factorial(num) << endl; 
    num++; 
    if(num > max) 
     return 0; 
    else 
     computeFactorials(num, max); 
} 

int factorial(int n) { 
    int result; 
    if (n == 1) 
     result = 1; 
    else 
     result = (factorial(n-1) * n); 
    return result; 
} 

Вот выполнение программы:

Factorial of 10: 3628800 

C:\MyPrograms\c++ optimize.cpp -o optimize.exe 

C:\MyPrograms>optimize 
Factorial of 1: 1 
Factorial of 2: 2 
Factorial of 3: 6 
Factorial of 4: 24 
Factorial of 5: 120 

я могу следовать до Num == 3, но когда дело доходит до 4 моя логика Безразлично» t добавить результаты. Я читаю код следующим образом:

computeFactorials(1,5), 1 означает, что число начинается, а 5 означает максимальное количество циклов. Я начну с 3-х, потому что я понимаю 1 и 2 как число.

«Факториал» (3): factorial(3), то в функции факториала 3 вычитается 1, равный 2, а затем умножается на 3 для результата 6.

Однако, когда программа попадает в пит равное 4, похоже, это уже не имеет никакого смысла. Поскольку Int результат факториалов() функции должны быть равны 12 не 24.

else result = (factorials (4-1) * 4) ; 

3 * 4 = 12, а не 24. Как эта программа получает до 24, а не 12? Затем снова делайте то же самое на num = 5, получая 120, а не 20.

Пожалуйста, помогите мне понять, я по-прежнему очень полезен на этом языке, спасибо. :)

+2

Чтобы понять рекурсию, вам сначала нужно понять рекурсию ;-) –

+0

@Roger Первое правило о рекурсии состоит в том, что вы не говорите об рекурсии. –

+0

@remyabel aaaaargh - я испортил мое условие прекращения ... извините (извините (извините (извините))) –

ответ

4

затем в функции факториала 3 вычитается 1, равный 2, а затем умножается на 3 для результата 6

No.

В функции факториала, 3 " вычитается на 1" , равным 2, то это 2 передается factorial в рекурсивном вызове:

  • factorial(2) * 3
  • = factorial(1) * 2 * 3
  • = 1 * 2 * 3
  • = 6

Результатом этого вызова является то, что умножается на 3 для результата 6.

Это (factorial(n-1) * n), не ((n-1) * n).


Однако, когда программа получает NUM равной 4 это, кажется, не имеет никакого смысла больше, потому что ИНТ результат факториалов() функции должны быть равны 12 не 24.

Если factorial(3) равно 6, то factorial(4) явно не может быть только 12, потому что это только два раза. 6. Он недостаточно взрослый.

  • factorial(3) * 4
  • = factorial(2) * 3 * 4
  • = factorial(1) * 2 * 3 * 4
  • = 1 * 2 * 3 * 4
  • = 24

3 * 4 = 12, а не 24

Правильно, но это не 4 факториала. 4 factorial is 1 * 2 * 3 * 4.

Я подозреваю, что вы наполовину запутаны factorial с the fibonacci sequence.

+0

Еще раз спасибо. Легкость. Мне нужно сосредоточиться на четком понимании факториалов, прежде чем заканчивать этот сегмент. :) –

+1

О, это вы! :) –

Смежные вопросы