c ++中数字阶乘的自写代码出错

时间:2016-04-26 17:53:01

标签: c++

请在下面的代码中指出错误:      #包括      使用namespace std;

 int factorial(int n) {
     int f=1;
     factorial(0)=1;
     factorial(1)=1;
     while(n>=0)
     {
         f=f*factorial(n);
         n=n-1;
     }
     return f;
 }

 int main() {
     cout << factorial(5);
 }

在编译器中,我得到错误&#34;左值作为赋值factorial(0)= 1的左操作数;&#34;

我无法理解上述错误。请解释一下。

3 个答案:

答案 0 :(得分:1)

你的代码真的错了。您无法为值分配函数。我想你正在寻找这样的东西:

#include <iostream>
using namespace std;

int Factorial(int n)
{
    if (n <= 1)
        return 1;

    return n * Factorial(n - 1);
}

int main()
{
    int number = Factorial(5);
    cout << number << endl;
}

答案 1 :(得分:0)

C ++不允许使用模式匹配函数定义。

答案 2 :(得分:0)

更新:周六就像学校一样...

#include <iostream>
#include <unordered_map>

int& factorial(int n) {
    static std::unordered_map<int,int> memo = {{0,1},{1,1}};
    if(!memo.count(n)) {
        memo[n] = n * factorial(n-1);
    }
    return memo[n];
}

int main() {
    using std::cout;

    cout << factorial(1) << '\n';  
    cout << factorial(5) << '\n';
    cout << "   ----\n";
    factorial(1) = 123456789;      // make factorial(1) better
    cout << factorial(1) << '\n';
    cout << factorial(5) << '\n';  // factorial(5) is still 120
    //                                because its value was saved
    //                                by the first factorial(5) call
}

它的行为与原始示例相似,但不幸的是,factorial(0)factorial(1)的记忆结果必须添加一个初始列表。从factorial(0) = 1;开始会导致无限递归。使用值n调用时,对于所有正整数&lt; = n,此版本还会自动将任何缺少的因子值添加到其备忘录中。最重要的是,用户仍然可以为以下任何输入自定义记忆结果:factorial(5) = 0;

这是一个使用类和垃圾的例子。

#include <iostream>
#include <unordered_map>

class factorial {
    static std::unordered_map<int,int>& map() {
        static std::unordered_map<int,int> outs;
        return outs;
    }
    int n;
public:
    factorial(int n) : n(n) {}
    factorial& operator = (int out) {
        map()[n] = out;
        return *this;
    }
    operator int () const {
        if(map().count(n)) return map()[n];
        return factorial(n-1) * n;
    }
};

int main() {
    using std::cout;

    // need to set low factorial values
    // to prevent infinite recursion
    factorial(0) = 1;
    factorial(1) = 1;

    cout << factorial(1) << '\n';  
    cout << factorial(5) << '\n';
    cout << "   ----\n";
    factorial(1) = 123456789;      // make factorial(1) better
    cout << factorial(1) << '\n';
    cout << factorial(5) << '\n';  // now factorial(5) is all messed up
    cout << "   ----\n";
    factorial(5) = 120;            // fix factorial(5)
    cout << factorial(5) << '\n';  // worked!
}

输出:

1
120
   ----
123456789
1929912792
   ----
120

Live Demo