动态规划,遍历方法
Dynamic Programming, Traversal Method
int fib(int numb){
vector<int> temp;
int str;
if(numb==0 || numb==1){
return numb;
}
else{
str=(fib(numb-1)+fib(numb-2));
temp.push_back(str);
return str;
}
for(int i=0;i<temp.size();i++){
if(temp[i]==numb){
return temp[i];
}}
斐波那契函数并且它有效,但是如何检查函数的 for 循环部分是否真的有效?它用于查找现有数字并返回它而不是处理另一个递归的遍历方法。
你的循环不可能工作。它永远不会起作用。因为没有办法进入循环。循环之前的每个代码路径都以 return
语句结尾。
逐条语句遍历您的代码,并亲自查看您的代码永远不会到达循环。
在返回任何值之前,必须处理存储的元素。此外,当您在递归调用期间将元素存储在向量中时,向量temp
必须是静态的。
研究不应该是这样的:你应该在向量中存储值,换句话说,你想要的temp[i]
是fib(i)
.
一个简单的方法是利用C++允许通过函数初始化静态值。然后你可以将temp
初始化为 { 0, 1},当被要求输入值时,只需查看该数字是否大于 temp.size
:
- 如果是,请计算它并将其存储到
temp
中 - 当您使用 fib(n-1) 和 fib(n-2) 的值计算它们时,当您计算它时,您知道temp
向量已经包含 fib(n-1),并且仍然不包含 fib(n) =>您只需将其推回temp
它 - 不仅仅是从
temp
中提取它
代码可以是:
// return a temporary vector containing 0 and 1
std::vector<int> inifib() {
std::vector<int> t;
t.push_back(0);
t.push_back(1);
return t;
}
int fib(unsigned int numb) {
static std::vector<int> temp = inifib(); // initialize once the static temp with size 2 and values 0,1
if (numb >= temp.size()) {
int cr = fib(numb-1) + fib(numb - 2);
temp.push_back(cr); // when we are here, temp contains everything up to fib(numb - 1) - just push
}
return temp[numb];
}
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- 循环遍历标准的正确方法::array<char*, N>
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 使用两种不同的方法遍历 Vector 的结果不一致
- 遍历矩阵的方法
- 遍历C++容器 - 最快的方法是什么?
- C/C++ 三维数组如何在内存中存储,以及遍历它的最快方法是什么
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 这是遍历阵列的更快方法
- 动态规划,遍历方法
- 无法使用非递归顺序方法遍历二叉树
- C++:遍历对象以调用相同的方法
- 在c++中遍历大文件的好方法是什么?
- 在遍历集合时从集合中擦除的最有效方法
- 有没有一种优雅的方法来遍历两个映射并比较值(映射具有相同的类型)
- 通过引用遍历节点的惯用方法