【问题标题】:combinatorial function c++ using Recursion使用递归的组合函数 c++
【发布时间】:2016-04-11 21:51:59
【问题描述】:

如果你不知道,这就是组合函数:

C(n,k)= { 1 如果 k=0 或 k = n C(n−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++ 新手,尤其是递归 ..

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

谢谢!

【问题讨论】:

  • 在循环中调用你的函数,你应该已经涵盖了。
  • 递归函数,即使正确实现,效率也会非常低,因为每个非终端调用都会产生两个新调用:这是指数级的。要了解正确性,请尝试调用 Pas(2, 4)。在更正函数使其正常工作后,使用迭代循环重新实现它。
  • 您不能打印整个帕斯卡三角形,因为它是一个无限级数。您可以先创建一个打印第一个n 层的函数。该函数很可能返回void
  • 这就是我想到的,一个循环。但我担心只能使用递归来做到这一点。我认为没有循环是不可能做到的。我会试试看,然后问我是否还有其他问题。谢谢大家:D

标签: c++ recursion using


【解决方案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 行。

【讨论】:

  • 谢谢。但是当我使用它时,它会颠倒打印出帕斯卡的三角形
  • @PhpLover1337 已更新。
  • 无限过程! ' cout
  • 我认为在你的 if 语句之后 printTriangle(); call 又少了一个值.. 我不确定
  • 我现在明白了,你们很棒:D 再次感谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

        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

    【讨论】:

    • 谢谢伙计。是否有可能递归地做到这一点?不需要循环?
    • 递归打印和递归计算一起做更体操,因为递归函数会多次计算相同的元素。但是如果你按行来做的话,那真的不是问题。
    • 非常感谢先生。你的循环和它的递归版本,让我很容易理解这个过程。我也很感激其他人。非常感谢你们:D
    • 哇,令人印象深刻!我想我们已经完成了..你杀了它,伙计:D我真的不知道如何感谢你..
    • 它不打印最后两个元素。但它很有帮助..谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2012-11-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多