[算法]挑战你思维中的墙

这篇文章主要要解决下面几个问题:

1,如何不用循环实现循环?

2,如何不用if else for while switch A?B:C实现选择?

3,如何不用+-*/实现+?

---------------------------------

Queston 1: 

不用乘除法,for whiel if else switch case A?B:C求1+2+3+4+..+n.

 

Solution 1-1:

通常情况下我们用循环很容易实现1+2+..+n,正是因为很容易实现,所以当禁止我们使用常见方法时,我们的大脑就短路了。这时候我们该考虑问题的本质,循环的本质是什么?其实是一条语句sum=sum+i被执行了n次。而语言里面的循环语句只是实现这一目的的一种手段而已。还有什么手段让一条语句自动的被执行n次?对象数组 Obj* myobjes=new Obj[n]; 在这语句里n个Obj类被创建了,可以把语句写在构造函数里。代码如下:

#include <iostream>
using namespace std;

class SumByClass
{
public:
    static unsigned int sum;
    static unsigned int n;
    SumByClass()
    {
        n++;
        sum+=n;
    }
    static int getSum()
    {
        return sum;
    }
};

unsigned int SumByClass::n=0;
unsigned int SumByClass::sum=0;

unsigned int getSum(int n)
{
    SumByClass* sco=new SumByClass[n];
    return SumByClass::sum;
}

Solution 1-2:

还可以用递归实现1+2+...+n,f(n)=f(n-1)+1,但是有一个问题,递归的返回怎么办?我们通常if(n==1) return 1就返回了。破解的思路与上面有点类似,数组,不同的语句写在不同的数组里,用数组的哪一项,这不是很容易确定的是吗?代码如下:

typedef int (*fun)(int);
int sum1(int);
int sum2(int);
fun myFun[2]={sum1,sum2};

int sum1(int n)
{
    return 0;
}

int sum2(int n)
{
    return n+myFun[!!n](n-1);
}

 

 

总结:

1,当遇到运算有关的,还禁止用+-*/的,可以往位运算方面考虑

2,当遇到分支选择,还禁止用if else while for switch A?B:C的可以考虑用数组实现选择

转载于:https://www.cnblogs.com/orchid/p/4025940.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值