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


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

    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的可以考虑用数组实现选择

  • 相关阅读:
    第3章 Spring AOP
    第2章 Spring中的Bean
    第1章 Spring的应用
    Codeforces Round #558 (Div. 2)-Cat Party (Hard Edition)-(前缀和 + 模拟)
    Codeforces Round #552 (Div. 3)-1154E-Two Teams-(模拟+双指针)
    Codeforces Round #552 (Div. 3)-D-Walking Robot-(贪心)
    Codeforces Round #552 (Div. 3)-C-Gourmet Cat
    Codeforces Round #555 (Div. 3)
    2019年湘潭大学程序设计竞赛(重现赛)
    Buy Fruits-(构造)
  • 原文地址:https://www.cnblogs.com/orchid/p/4025940.html
Copyright © 2020-2023  润新知