2016-04-11 5 views
2

Теперь это комбинаторная функция, если вы не знаете:комбинаторной функции C++ с использованием рекурсии

С (п, к) = {1, если к = 0 или к = п С (п-1, k-1) + C (n-1, k) в противном случае

Теперь мне действительно нужно использовать рекурсию для печати треугольника Паскаля.

Хорошо, так что я сделал до сих пор эта простая функция рекурсии:

#include <iostream> 
using namespace std; 

int Pas(int r, int c) { 
    if (c == 0 || c == r) { 
     return 1; 
    } else { 
     return Pas(r - 1, c - 1) + Pas(r - 1, c); 
    } 
} 

int main(){ 

    cout << Pas(4,2) << endl; 

    return 0; 
} 

Теперь эта функция вычисляет отлично, например:

Pas(4,2) = 6 

Но у меня проблемы с использованием его чтобы напечатать весь треугольник Паскаля, потому что я новичок в C++ и особенно в рекурсии.

Я был бы признателен за любую обратную связь, и я надеюсь, что кто-то поможет выяснить этот пр. oblem. Но я был бы признателен, если бы вы, ребята, не просто дали мне весь ответ (код) именно так; Я хочу учиться.

Спасибо!

+0

Вызовите свою функцию в цикле (-ах), вы должны иметь это покрытие. – LogicStuff

+0

Рекурсивная функция, даже если она выполнена правильно, будет чрезмерно неэффективной, поскольку каждый нетерминальный вызов генерирует два новых вызова: это экспоненциальный. Чтобы получить представление о правильности, попробуйте позвонить в Pas (2, 4). После исправления функции, чтобы она работала, переопределите ее с помощью итеративного цикла. –

+0

Вы не можете распечатать весь треугольник Паскаля, потому что это бесконечная серия. Вы можете начать с создания функции, которая печатает первые слои 'n'. Функция, скорее всего, вернет 'void'. –

ответ

1

Нечто похожее на thi s мощь на работу

void printTriangle(int printRows, int a = 1, int b = 0) 
{ 
    if (a > printRows) return; 
    int val = Pas(a, b); 
    cout << val << " "; 
    if (a == b) { 
     cout << endl; 
     printTriangle(printRows, a + 1, 0); 
    } else { 
     printTriangle(printRows, a, b + 1); 
    } 
} 

Запуск printTriangle(7) должен напечатать первые 7 рядов.

+0

Спасибо. Но когда я его использую, он печатает треугольник Паскаля в обратном порядке – PhpLover1337

+0

@ PhpLover1337 Обновлено. – pingul

+0

Бесконечный процесс! 'cout << val << ""; ' – PhpLover1337

1

Если вам разрешено использовать рекурсивную функцию в цикле, проще всего было бы что-то вроде:

int n=4; 

for (int i=0; i<=n; i++) { 
    for (int j=0; j<=i; j++) { 
     cout << Pas(i,j)<<" "; 
    } 
    cout <<endl; 
} 

Если вы хотите, чтобы укрепить макет, вы co также #include <iomanip> и <limits> использовать фиксированный размер номер выход, используя количество цифр, необходимых для отображения целого: просто заменить выходное заявление с:

cout << setw(numeric_limits<int>::digits10+1)<<Pas(i,j); 

Edit:

Вы можете легко создать рекурсивную функцию для печати строк треугольника:

void PrintPas(int r) { 
    if (r==1) 
     cout << Pas(1,0); 
    else { 
     PrintPas(r-1); 
     for (int c=0; c<=r; c++) 
      cout << Pas(r,c)<< " "; 
    } 
    cout <<endl; 
} 

Edit 2

Если вы хотите полностью рекурсивная версия:

void PrintPas(int r, int c) { 
    if (r==1) 
     cout << Pas(1,0)<<" "; 
    else if (c==-1) { 
     PrintPas(r-1,r-1); 
    } 
    else { 
     PrintPas(r,c-1); 
     cout << Pas(r,c)<< " "; 
    } 
    if (r==c) 
     cout <<endl; 
} 

Online demo

+0

Спасибо, друг. Можно ли это сделать рекурсивно? без каких-либо петель? – PhpLover1337

+0

Это более гимнастика, чтобы сделать рекурсивную печать вместе с рекурсивным вычислением, потому что рекурсивная функция будет вычислять несколько раз те же самые элементы. Но если вы делаете это по очереди, это не проблема. – Christophe

+0

Большое спасибо, сэр. Ваша петля и рекурсивная версия этого документа помогли мне понять этот процесс. И я тоже ценю всех. Спасибо y'all так много: D – PhpLover1337

1

Tail recursion - это рекурсивный эквивалент итерационным циклам. Следующая функция при вызове с sum(0, 5)

int sum(int start, int end, int resultSoFar = 0) { 
    if (start == end) return resultSoFar; 
    return sum(start + 1, end, resultSoFar + start); 
} 

эквивалентна итеративной функции, вызываемой с sum(0, 5).

int sum(int start, int end) { 
    int resultSoFar = 0; 
    for (int i = start; i < end; i++) { 
     resultSoFar += i; 
    } 
    return resultSoFar; 
}