• 15. 计算 n!(非递归方法)


    题目:

    编写非递归函数计算 n!。测试你的代码。 

    思路:

     首先,计算阶乘可以使用递归函数,代码如下:

    1 long long factorial_recursion (int n) {
    2     if (n <= 1) {
    3         return 1;
    4     } else {
    5         return n * factorial_recursion ( n - 1 );
    6     }
    7 }

    我们观察上面的递归函数,可以发现计算思路:从给定值进行倒推,直到计算出结果。这样做的好处是代码符合思路,好看简洁也容易写,但是问题在于,递归计算容易造成栈溢出和中间值溢出。

    不用递归,自然就用迭代,递归倒着推,那迭代就正着算。

    代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 long long factorial_recursion (int n) {
     5     if (n <= 1) {
     6         return 1;
     7     } else {
     8         return n * factorial_recursion ( n - 1 );
     9     }
    10 }
    11 
    12 long long factorial (int n) {
    13     int temp = 1;
    14     for (int i = 1; i <= n; ++i) {
    15         temp *= i;
    16     }
    17 
    18     return temp;
    19 }
    20 
    21 int main() {
    22     int n;
    23     cout << "Enter n : ";
    24     cin >> n;
    25     long long result = factorial_recursion (n);
    26     cout << "result(recursion) : " << result << endl;
    27 
    28     result = factorial(n);
    29     cout << "result(non-recursion) : " << result << endl;
    30 
    31     return 0;
    32 }

    代码中有几处需要说明:

    第一,注意将局部变量 temp 初始化为 1,因为这是乘法。

    第二,循环内控制变量从 1 开始,到 n 结束,中间 temp 作为累乘的计算结果。最后返回 temp。

     第三,第一个函数是递归计算,第二个函数是迭代计算,放在一起有利于对比。

  • 相关阅读:
    faked 一个用于 mock 后端 API 的轻量工具
    分享开源 Markdown 编辑器 Mditor 的「桌面版」
    一个 MVC 框架以 MVVM 之「魂」复活了!
    简单的内存缓存模块
    Node 多进程并发控制小模块
    Confman
    用 Nokitjs 解决前端开发中的跨域问题
    LEK分布式日志系统搭建
    hello world2
    hello world!
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/12312944.html
Copyright © 2020-2023  润新知