组合函数c ++使用递归

时间:2016-04-11 21:51:59

标签: c++ recursion using

现在这是组合函数,如果你不知道它:

如果k = 0或k = n,则

C(n,k)= {1            否则C(n-1,k-1)+ C(n-1,k)

现在,我真正需要的是使用递归来打印Pascal的三角形。

好的,我到目前为止所做的就是这个简单的递归函数:

#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

但是我在使用它来打印整个Pascal的三角形时遇到了问题,因为我是C ++的新手,特别是递归...

我很感激任何反馈,我希望有人能帮助解决这个问题。但是如果你们不仅仅给我这样的答案(代码),我会更加感激;我想学习。

谢谢!

3 个答案:

答案 0 :(得分:1)

如果允许在循环中使用递归函数,最简单的方法是:

int n=4; 

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

如果你想加强布局,你还可以#include <iomanip><limits>使用固定大小的数字输出,使用显示整数所需的位数:只需将输出语句替换为:

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

修改:

您可以轻松构建递归函数来打印三角形的线条:

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; 
}

修改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

答案 1 :(得分:1)

与此相似的东西

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行。

答案 2 :(得分: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;
}