gpt4 book ai didi

c++ - 分区、斯特林数和第一个切比雪夫多项式的递归函数

转载 作者:行者123 更新时间:2023-11-28 02:44:01 27 4
gpt4 key购买 nike

所以我正在做家庭作业,我需要为分区、斯特林数(第一类和第二类)和第一类的切比雪夫多项式创建递归函数。我的程序应该能够让用户输入一个正整数 n,然后创建名为 Partitions.txt、Stirling1.txt、Stirling2.txt 和 Chebyshev.txt 的文件,创建一个包含所有值 f(k,m) 的表对于 1<=k<=n 和 1<=m<=n。我正在努力开始这项任务,尽管我一直在做研究并试图弄清楚,但我觉得我对它一无所知。如果有人可以帮助我,我将不胜感激!谢谢!

    #include <iostream>
#include <vector>
#include "OutputFile.h"

using namespace std;
using namespace OutputStream;


int firstKindStirling();
vector<vector<int> > getPartitions(int number, int maxElement);

int main() {

cout << "Welcome! Please input a number m:";
int m;
cin>>m;


OFile fout("Partitions.txt");

return 0;
}

vector<vector<int> > getPartitions(int number, int maxElement)
{
if (number < 1)
return vector<vector<int>>();

vector<vector<int>> partitions;

if (number <= maxElement)
partitions.push_back(number); //for some reason this doesn't want to work. Not sure what I'm missing here.

for (int i = number - maxElement; i < number; ++i)
{
// (recursively) get the partitions of `i`, with elements no larger than `n - i`
auto partitionsForI = getPartitions(i, number - i);

// add `n - i` to the front of all of those partitions
for(vector<int>& partition : partitionsForI)
{
partition.insert(partition.begin(), number - i);
}

// add these new partitions to our list.
partitions.insert(partitions.end(), partitionsForI.begin(), partitionsForI.end());
}
return partitions;
}

int firstKindStirling(int n, int k)
{
if (n == 0 && k == 0) return 1;
else if (n == 0 || k == 0) return 0;
else return -(n-1) * firstKindStirling(n-1, k) + firstKindStirling(n-1, k-1);
}

这是我的输出 .h 文件

    #ifndef OUTPUT_H
#define OUTPUT_H

#include <fstream>
#include <string>
#include <vector>
#include <iostream>
#include <sys/stat.h>
#include <sstream>
#include <memory>

namespace OutputStream {

class OFile {
std::ofstream file;
public:

OFile(std::string filename, size_t output_precision = 10) {

file.open(filename);
if(file.fail()) throw std::runtime_error("Error: cannot open file");

file.precision(output_precision);

};

/*
OFile& operator<<(int x) {
file<<x;
return *this;
}
*/

/*
OFile& operator<<(const Point2D& p) {
file<<p;
return *this;
}
*/

OFile& operator<<(const std::vector<int>& v) {

for(auto x : v) file<<x<<std::endl;
return *this;
}


template<typename T>
OFile& operator<<(const T& p) {
file << p;
return *this;
}


~OFile() { file.close(); };

};


// Strongly enumerate type
enum class FileType { Input, Output, SafeOutput };

// Partial Template Specialization
template<FileType> class File;

template<>
class File < FileType::Input > {
public:
File( const std::string& filename ) : fin(filename) {

if(fin.fail()) throw std::runtime_error("Error opening file: "+filename);
};

/** ...

IFile& allows for syntax like
fin>>a>>b>>c;
*/
File& operator>>(int& a) {
fin>>a;
return *this;
}

/**...*/
operator bool() {
return !(fin.fail());
}

operator std::string() {
return "Active";
}

// operator [data type]() {
// code here
// return [object of type data type];
// }

friend File& getline( File& fin, std::string& line) {
getline( fin.fin, line);
return fin;
}

friend File& getrow( File& fin, std::vector<int>& rows);
friend File& getmatrix( File& fin, std::vector< std::vector<int> >& table);

~File() { fin.close(); };
private:
std::ifstream fin;
};

template<>
class File < FileType::Output > {
std::ofstream file;
public:

File(std::string filename, size_t output_precision = 10) {

file.open(filename);
if(file.fail()) throw std::runtime_error("Error: cannot open file");

file.precision(output_precision);

};

/*
OFile& operator<<(int x) {
file<<x;
return *this;
}
*/

/*
OFile& operator<<(const Point2D& p) {
file<<p;
return *this;
}
*/

File& operator<<(const std::vector<int>& v) {

for(auto x : v) file<<x<<std::endl;
return *this;
}


template<typename T>
File& operator<<(const T& p) {
file << p;
return *this;
}


~File() { file.close(); };

};

}

#endif

最佳答案

这真的是几个问题合二为一,所以我会分成几个部分来回答。

分区

这可能是这些任务中最难的,但如果您将其分解,它是非常可行的。

n 的所有分区是什么?每个分区中的第一个数字必须介于 1 和 n 之间。由于我们不关心顺序,所以让我们始终保持数字降序。所以第一个分区列表看起来像这样:

  • {n}
  • {n-1, 1}
  • {n-2, 2}, {n - 2, 1, 1}
  • {n-3, 3}, {n - 3, 2, 1}, {n - 3, 1, 1, 1}
  • ...
  • {1, 1, ..., 1}

但是等等!我们可以更简单地说。就是这样

  • [以n开头的分区集]
  • [以 n - 1 开头的分区集]
  • [以 n - 2 开头的分区集]
  • ...
  • [以1开头的分区集]

对于 1 到 n 之间的所有 i,这实际上只是所有以 n - i 开头的分区。所以,如果我们能找到一种方法为每个 i 获取每组分区,我们就可以简化事情。

我们该怎么做?好吧,如果我们考虑一下,我们就会意识到我们可以很容易地获得以 n - i 开头的每个分区。每个分区只是 n - i 后跟一种获取加起来为 i 的数字的方法...这正是分区的含义,所以我们找到了我们的递归案例!我们通过获取 n - i 后跟 i 的每个分区来获取所有分区。

现在我们只需要一个基本案例。这很简单:我们可以将零的分区定义为空集。

将它们放在一起

那么这看起来像什么?

vector<vector<int>> getPartitions(int number, int maxElement)
{
if (number < 1) return vector<vector<int>>();
vector<vector<int>> partitions;

if (number <= maxElement) partitions.push_back({number});

for (int i = number - maxElement; i < number; ++i)
{
// (recursively) get the partitions of `i`, with elements no larger than `n - i`
auto partitionsForI = getPartitions(i, number - i);

// add `n - i` to the front of all of those partitions
for(vector<int>& partition : partitionsForI)
{
partition.insert(partition.begin(), number - i);
}

// add these new partitions to our list.
partitions.insert(partitions.end(), partitionsForI.begin(), partitionsForI.end());
}
return partitions;
}

斯特林数

这些非常相似。如果您查看它们各自的维基百科页面,您可以找到每种类型的递归关系:

First Kind

s1(n, k) = -(n - 1) * s1(n - 1, k) + s1(n - 1, k - 1)

Second Kind

S2(n, k) = k * S2(n - 1, k) + S2(n - 1, k - 1)

并且它们具有相同的基本情况:S(0, 0) = 1S(n, 0) = 0S(0, n) = 0

所以你可以定义一个函数来像这样计算它们:

int firstKindStirling(int n, int k) 
{
if (n == 0 && k == 0) return 1;
else if (n == 0 || k == 0) return 0;
else return -(n-1) * firstKindStirling(n-1, k) + firstKindStirling(n-1, k-1);
}

第二类的看起来非常相似。

切比雪夫多项式

目前还不完全清楚这里的要求是什么。我假设它是在某一点上评估一个,而不是想出一些扩展的表示。它与斯特林数几乎相同。

再次,the wikipedia page有递推关系:

chebyshev(0, x) = 1
chebyshev(1, x) = x
chebyshev(n, x) = 2 * x * chebyshev(n-1, x) - chebyshev(n-2, x)

我假设您可以弄清楚如何将其变成一个函数。 (提示:基本上只需要将这些左侧变成 if 语句,类似于上面的示例。)

关于c++ - 分区、斯特林数和第一个切比雪夫多项式的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com