根据参数创建数组

时间:2018-09-25 00:42:05

标签: c++ fibonacci

import UIKit

class Foo {
    @objc func buttonClicked() {
        print("clicked")
    }
}

class ViewController: UIViewController {

    let foo = Foo()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 50, y: 200, width: 100, height: 30))
        button.setTitle("Press me", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        button.addTarget(foo, action: #selector(Foo.buttonClicked), for: .touchUpInside)
        self.view.addSubview(button)
    }
}

我正在尝试编写一个函数,该函数将返回斐波那契数列的结果直到最大点。问题是编译器说声明数组时max必须具有一个恒定值。我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

认识到您只需要跟踪三个数字并实现该功能而无需数组:

int fibonacci(int max)
{
    if (max < 2)
        return max;

    int a = 1;
    int b = 1;
    int c;
    int result = 1;

    for (int i = 0; i < max - 2; i++) {
        switch (i % 3) {
        case 0:
            result = c = b + a;
            break;
        case 1:
            result = a = c + b;
            break;
        case 2:
            result = b = c + a;
            break;
        }
    }

    return result;
}

答案 1 :(得分:1)

您遇到了所谓的动态数组或STL-Vectors存在的原因。

编译器抛出该错误的原因是由于 在标准数组实现中必须在声明期间精确指定数组大小

float a[100] <- correct
float a[] <- incorrect

这是正确的,因为编译器完全知道必须将特定数据类型的内存分配给此数组集合。

现在让我们进入动态数组-原始指针和STL向量,它使您可以在运行时确定数组大小。

方法1:原始指针

#include <cstddef> // std::size_t

int evenFibonacciSum(int max)
{
    int *fib=NULL;

    fib = new int[max+2];

    fib[0] = 0;
    fib[1] = 1;

    for (std::size_t i = 2; i <= max; i++)
        fib[i] = fib[i - 1] + fib[i - 2];

    int result = fib[max];
    delete [] fib;
    return result;
}

方法2:STL向量

#include <cstddef>
#include <vector>

int evenFibonacciSum(int max)
{
    std::vector<int> fib(max+2);

    fib[0] = 0;
    fib[1] = 1;

    for (std::size_t i = 2; i <= max; i++)
        fib[i] = fib[i - 1] + fib[i - 2];

    return fib[max];
}

我建议您使用方法2:STL向量,因为它可以自动处理这种动态分配所引起的内存管理问题。

祝您有美好的一天!

Arul Verman