计算1到n的和(不用循环且逐步限制条件)

简介: 注:满足题目要求的解法有递归实现的第三种、公式实现、C++调用构造函数累加法三种方法、

  注:满足题目要求的解法有递归实现的第三种、公式实现、C++调用构造函数累加法三种方法、



一、题目简单描述

 最近看到一道很有趣的算法题,更像脑筋急转弯吧,如下图:



我们可以看到,题目中给出的限制条件很多。先不管限制条件是什么,我们计算1到n的和无非就是用循环、递归、公式(等差数列)三类方法来计算。当然,循环实现很简单,这里就不再介绍。那么,不用循环怎么实现呢?我们先看用递归的方法。



二、递归实现

  注意,我们先不管题目给出的限制条件,我们这里只限制不能用循环只用递归,看看都有哪些方法。



1、if…else…

 用if…else…来判断递归的停止条件,相对也很容易,我们直接看代码。


int Sum_Solution(int n)
{
  if (n == 1)
    return 1;
  return n + Sum_Solution(n - 1);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret=Sum_Solution(n);
  printf("%d", ret);
  return 0;
}


2、三目运算符 ?:

 在不用循环和if…else…的情况下还能怎么用呢?我们还可以想到三目运算符。其实三目运算符与if…else…思想大同小异,我们直接看代码。

int sum_solution(int n)
{
    return n==1?1:sum_solution(n-1)+n;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret=Sum_Solution(n);
  printf("%d", ret);
  return 0;
}


3、逻辑与操作符 &&


 难度加大,在不用循环和if…else…和三目运算符的情况下还能怎么用呢?好像不容易想出来其他方法了。其实当我们熟知逻辑与操作符(&&)的一个特性时,也就很用以做出来。当提到逻辑与操作符时,可能一时间想不到该怎么用。这时我们想想逻辑与操作符的性质。当两个条件同时为真时才为真,当第一个条件为假时,就不执行第二个条件了。 这就是我们要抓住的点,来作为递归停止的条件。我们直接看代码。

int Sum_Solution(int n )
{
    int sum=n;
        sum&&(sum+=Sum_Solution(n-1));
    return sum;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret=Sum_Solution(n);
  printf("%d", ret);
  return 0;
}

其实这种解法就满足本题目的要求了。

三、公式实现


公式实现的方法有很多,用乘除法、循环都很容易实现。但是题目中还要求了不能够用乘除法,那怎么用公式实现呢?在这里用了一个很巧妙的方法,就是定义一个二维数组,数组存储的数据类型大小为一个字节,通过计算数组的大小,最后用右移操作符(>>)相当于除于2来实现。我们结合代码一起理解一下。


int Sum_Solution(int n )
{
    char arr[n][n+1];
    return sizeof(arr)>>1;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret=Sum_Solution(n);
  printf("%d", ret);
  return 0;
}


四、C++调用构造函数累加法


我们都知道C++在类和对象中,实例化对象都会调用构造函数。我们通过创建n个对象,同时设置成员变量为静态的,调用构造函数的累加法来实现。文字可能会有点不易理解,我们直接看代码。

class sum
{
public:
    sum()
    {
        ret+=i;
        ++i;
    }
    static int GetRet()
    {
        return ret;
    }
private:
    static int ret;
    static int i;
};
int sum::ret=0;
int sum::i=1;
class Solution {
public:
    int Sum_Solution(int n)
    {
        sum a[n];
        return sum::GetRet();
    }
};




 这种方法也是满足题目的要求的。

 我个人感觉这道题目挺有趣的,就整理出来跟大家分享一下。当然,可能还有其它的解法,欢迎大家讨论。

 希望本篇文章对你有所帮助,感谢观看ovo!


相关文章
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Conv和Transformer】| GRSL-2024最新模块 卷积和自注意力融合模块 CAFM 减少图像中的噪声干扰
RT-DETR改进策略【Conv和Transformer】| GRSL-2024最新模块 卷积和自注意力融合模块 CAFM 减少图像中的噪声干扰
539 19
RT-DETR改进策略【Conv和Transformer】| GRSL-2024最新模块 卷积和自注意力融合模块 CAFM 减少图像中的噪声干扰
|
存储 C语言
C语言实现简易图书管理系统
C语言实现简易图书管理系统
662 1
|
机器学习/深度学习 设计模式 Rust
Rust机器学习之tch-rs
整体上tch-rs的使用思路和PyTorch是一致的,因为本身tch-rs就是PyTorch的C++库`libtorch`的绑定。如果你熟练使用PyTorch,那么用tch-rs上手会非常快。关键是用tch-rs能够带给你更快的速度,这在大规模项目中是一个巨大的优势。
2088 0
Rust机器学习之tch-rs
|
SQL 存储 人工智能
Flink 在蚂蚁实时特征平台的深度应用
本文整理自蚂蚁集团高级技术专家赵亮星云,在 Flink Forward Asia 2023 AI 特征工程专场的分享。
2813 3
Flink 在蚂蚁实时特征平台的深度应用
|
存储 分布式计算 Hadoop
深入浅出:Hadoop的start-balancer.sh与hdfs balancer分布式数据均衡
Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候,将引发很多问题,比如:1、MR程序无法很好地利用本地计算的优势2、机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等等。
4184 0
|
存储 云计算 虚拟化
什么是IaaS,PaaS和SaaS及其区别
云计算的三种服务模式:IaaS,PaaS和SaaS Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-Service,Software(软件)-as-a-Service。
15700 0
|
存储 SQL 数据管理
【数据库技术基础】数据库的三级模式结构
【数据库技术基础】数据库的三级模式结构
786 0
【数据库技术基础】数据库的三级模式结构
|
Ubuntu Linux Windows
Linux初体验—— 第1关:初级
Linux初体验—— 第1关:初级
869 1
Linux初体验—— 第1关:初级
|
消息中间件 缓存 负载均衡