如何指示/打印此斐波纳契数字程序的不同组合?

时间:2018-02-21 21:10:38

标签: c++ fibonacci

我正在构建一个函数来确定一个人爬到楼梯顶部的不同方式(可以爬1步或2步)。虽然我已经掌握了打印多少种方式的主要功能,但我对如何打印特定组合感到困惑,即有三种方法可以爬到顶端:(1,1,1),(1,2),( 2,1)。

#include <iostream>
using namespace std;

int climbStairs(int n);

int main()
{
  int s = 4;
  cout << "There are " << climbStairs(s) << " ways to climb to the top: ";           
  return 0;
}

int climbStairs(int n)    
{    
  if(n == 0) return 0;
  if(n == 1) return 1;
    int one = 1;
    int two = 0;
    int result = 0;   
    for(int i = 1;i <= n;i++)
    {
       result = one + two;
       two = one;
       one = result;
    }   
    return result;
}

关于如何打印组合的任何解释都会有所帮助,非常感谢你!

1 个答案:

答案 0 :(得分:0)

不要将变量onetwo作为整数,而是将它们定义为“路径”集。然后,做同样的事情,除了resultone时,其中的所有“路径”附加1加上two,并且其中的所有“路径”都附加了2。

算法看起来像这样(我建议在查看我的代码之前尝试自己做):

#include <set>
#include <string>
#include <iostream>
std::set<std::string> climbStairs(int n)
{
    if(n == 0)
        return {""};
    if(n == 1)
        return {"1"};
    std::set<std::string> one({"1"}), two({""}), result;
    for(int i = 2; i <= n; i++)
    {
        result.clear();
        for(const std::string &path : one)
        {
            result.insert(path + '1');
        }
        for(const std::string &path : two)
        {
            result.insert(path + '2');
        }
        two = move(one);
        one = move(result);
    }
    return one;
}

int main()
{
    std::set<std::string> s = climbStairs(5);
    for(const std::string &path : s)
    {
        std::cout << path << '\n';
    }
}

这是我所知道的最佳方式。