青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

http://zhedahht.blog.163.com/blog/static/2541117420072915131422/題目:求1+2+…+n,要求不能使用乘除法、forwhileifelseswitchcase等關鍵字以及條件判斷語句(A?B:C)。

分析:這道題沒有多少實際意義,因為在軟件開發中不會有這么變態的限制。但這道題卻能有效地考查發散思維能力,而發散思維能力能反映出對編程相關技術理解的深刻程度。

通常求1+2+…+n除了用公式n(n+1)/2之外,無外乎循環和遞歸兩種思路。由于已經明確限制forwhile的使用,循環已經不能再用了。同樣,遞歸函數也需要用if語句或者條件判斷語句來判斷是繼續遞歸下去還是終止遞歸,但現在題目已經不允許使用這兩種語句了。

我們仍然圍繞循環做文章。循環只是讓相同的代碼執行n遍而已,我們完全可以不用forwhile達到這個效果。比如定義一個類,我們new一含有n個這種類型元素的數組,那么該類的構造函數將確定會被調用n次。我們可以將需要執行的代碼放到構造函數里。如下代碼正是基于這個思路:

class Temp
{
public:
      Temp() { ++ N; Sum += N; }

      static void Reset() { N = 0; Sum = 0; }
      static int GetSum() { return Sum; }

private:
      static int N;
      static int Sum;
};

int Temp::N = 0;
int Temp::Sum = 0;

int solution1_Sum(int n)
{
      Temp::Reset();

      Temp *a = new Temp[n];
      delete []a;
      a = 0;

      return Temp::GetSum();
}

我們同樣也可以圍繞遞歸做文章。既然不能判斷是不是應該終止遞歸,我們不妨定義兩個函數。一個函數充當遞歸函數的角色,另一個函數處理終止遞歸的情況,我們需要做的就是在兩個函數里二選一。從二選一我們很自然的想到布爾變量,比如ture1)的時候調用第一個函數,false0)的時候調用第二個函數。那現在的問題是如和把數值變量n轉換成布爾值。如果對n連續做兩次反運算,即!!n,那么非零的n轉換為true0轉換為false。有了上述分析,我們再來看下面的代碼:

class A;
A* Array[2];

class A
{
public:
      virtual int Sum (int n) { return 0; }
};

class B: public A
{
public:
      virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};

int solution2_Sum(int n)
{
      A a;
      B b;
      Array[0] = &a;
      Array[1] = &b;

      int value = Array[1]->Sum(n);

      return value;
}

這種方法是用虛函數來實現函數的選擇。當n不為零時,執行函數B::Sum;當n0時,執行A::Sum。我們也可以直接用函數指針數組,這樣可能還更直接一些:

typedef int (*fun)(int);

int solution3_f1(int i) 
{
      return 0;
}

int solution3_f2(int i)
{
      fun f[2]={solution3_f1, solution3_f2}; 
      return i+f[!!i](i-1);
}

另外我們還可以讓編譯器幫我們來完成類似于遞歸的運算,比如如下代碼:

template <int n> struct solution4_Sum
{
      enum Value { N = solution4_Sum<n - 1>::N + n};
};

template <> struct solution4_Sum<1>
{
      enum Value { N = 1};
};

solution4_Sum<100>::N就是1+2+...+100的結果。當編譯器看到solution4_Sum<100>時,就是為模板類solution4_Sum以參數100生成該類型的代碼。但以100為參數的類型需要得到以99為參數的類型,因為solution4_Sum<100>::N=solution4_Sum<99>::N+100。這個過程會遞歸一直到參數為1的類型,由于該類型已經顯式定義,編譯器無需生成,遞歸編譯到此結束。由于這個過程是在編譯過程中完成的,因此要求輸入n必須是在編譯期間就能確定,不能動態輸入。這是該方法最大的缺點。而且編譯器對遞歸編譯代碼的遞歸深度是有限制的,也就是要求n不能太大。

大家還有更多、更巧妙的思路嗎?歡迎討論^_^

本文已經收錄到《劍指Offer——名企面試官精講典型編程題》一書中,有改動。歡迎關注。我把這篇博客翻譯成了英文,感興趣的朋友可以到

http://codercareer.blogspot.com/2011/10/no-08-calculate-12n.html查看。

博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。對解題思路有任何建議,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht與我討論。謝謝。
from:
http://zhedahht.blog.163.com/blog/static/2541117420072915131422/

posted on 2012-07-05 10:04 chatler 閱讀(478) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美+日本+国产+在线a∨观看| 亚洲欧美国产精品专区久久| 香蕉尹人综合在线观看| 老司机免费视频一区二区| 亚洲视频axxx| 欧美日韩在线第一页| 亚洲欧洲在线看| 猫咪成人在线观看| 久久精品视频在线免费观看| 国产欧美日韩亚洲精品| 久久se精品一区二区| 亚洲一区二区视频在线观看| 国产精品hd| 中文一区二区在线观看| 亚洲二区免费| 欧美国产日韩a欧美在线观看| 亚洲国产精品久久久久秋霞蜜臀 | 欧美精品情趣视频| 亚洲人成在线播放网站岛国| 亚洲第一黄网| 美女被久久久| 亚洲伦理自拍| 在线亚洲自拍| 国产伦精品一区二区| 久久激情五月丁香伊人| 久久www成人_看片免费不卡| 国产一区二区久久| 欧美国产视频日韩| 亚洲风情亚aⅴ在线发布| 久久成人综合视频| 女仆av观看一区| 国产欧美日韩激情| 亚洲黑丝在线| 99国产精品99久久久久久粉嫩| 亚洲人成在线观看一区二区 | 亚洲国产精品久久久久秋霞不卡| 国产精品综合不卡av| 99re热这里只有精品视频| 亚洲欧洲精品一区二区| 葵司免费一区二区三区四区五区| 老司机一区二区| 黄色日韩网站视频| 久久久精品国产99久久精品芒果| 久久精品盗摄| 国产主播精品| 久久五月婷婷丁香社区| 欧美一区二区免费观在线| 国产精品久久福利| 亚洲一区二区三区777| 欧美亚洲免费在线| 国产伦一区二区三区色一情| 亚洲免费小视频| 欧美在线视频日韩| 精品91免费| 猛男gaygay欧美视频| 亚洲激情欧美激情| 亚洲私人影院在线观看| 欧美日韩国产首页| 99国产精品一区| 午夜久久黄色| 国内精品久久久久久久影视蜜臀 | 欧美日韩国产高清| 亚洲伦理中文字幕| 午夜在线观看欧美| 狠狠色香婷婷久久亚洲精品| 久久久久久欧美| 美女性感视频久久久| 91久久久久久久久| 欧美日韩999| 午夜亚洲性色视频| 久久伊人亚洲| 亚洲国产成人在线视频| 欧美日韩视频在线第一区| 亚洲综合999| 欧美激情在线观看| 亚洲免费网址| 在线视频观看日韩| 欧美午夜精品久久久| 久久精品中文字幕免费mv| 狼人社综合社区| 亚洲黄色在线| 国产精品一区久久久| 久久亚洲捆绑美女| 亚洲一区二区三区激情| 欧美成人免费在线视频| 欧美亚洲一区二区在线| 亚洲国产mv| 国产精品日韩久久久| 久久久久久黄| 亚洲一区精品电影| 亚洲黄网站黄| 鲁大师成人一区二区三区| 在线视频精品一区| 亚洲高清成人| 国产欧美日韩视频在线观看 | 亚洲一区二区三| 一区二区亚洲精品国产| 美女网站在线免费欧美精品| 亚洲女性喷水在线观看一区| 欧美激情网站在线观看| 久久aⅴ国产紧身牛仔裤| 99re6这里只有精品| 依依成人综合视频| 国产精品一级二级三级| 欧美激情一区三区| 美女视频黄 久久| 久久成人久久爱| 亚洲在线第一页| 一区二区欧美在线| 亚洲卡通欧美制服中文| 欧美国产精品中文字幕| 久久久久久亚洲精品杨幂换脸| 9色精品在线| 亚洲人成人77777线观看| 伊人婷婷久久| 狠色狠色综合久久| 国产在线精品一区二区中文| 国产精品入口日韩视频大尺度| 欧美激情四色| 欧美h视频在线| 欧美成年人在线观看| 久久亚洲电影| 看片网站欧美日韩| 久久免费黄色| 理论片一区二区在线| 欧美伊人精品成人久久综合97| 欧美一二三区在线观看| 欧美一区成人| 久久久久国产精品一区三寸| 久久超碰97中文字幕| 久久久福利视频| 暖暖成人免费视频| 在线播放视频一区| 免费在线欧美视频| 欧美日韩午夜在线视频| 国产精品一区二区在线观看不卡 | 久久久久久97三级| 美女在线一区二区| 亚洲精品一区二| 欧美一区永久视频免费观看| 欧美mv日韩mv国产网站app| 欧美日韩在线不卡| 激情亚洲成人| 亚洲制服av| 裸体歌舞表演一区二区 | 亚洲第一页中文字幕| 亚洲精品一二三| 欧美影院在线| 欧美日韩精品一区视频| 韩日午夜在线资源一区二区| av成人手机在线| 久久综合色影院| a4yy欧美一区二区三区| 久久久久久久久久久久久9999| 欧美日韩国产探花| 在线日韩视频| 欧美专区在线播放| 亚洲精品综合久久中文字幕| 久久精精品视频| 国产精品v一区二区三区| 亚洲国产另类久久精品| 欧美影视一区| 99一区二区| 欧美黄色网络| 在线免费观看日本一区| 小处雏高清一区二区三区| 亚洲精品综合| 免费一级欧美片在线观看| 黑人一区二区三区四区五区| 亚洲男女自偷自拍| 日韩一级精品| 欧美精品成人91久久久久久久| 尤物yw午夜国产精品视频| 欧美中文字幕在线观看| 亚洲婷婷在线| 欧美性大战久久久久久久蜜臀| 亚洲精品资源美女情侣酒店| 欧美~级网站不卡| 久久久噜噜噜久噜久久| 国产女人aaa级久久久级| 亚洲欧美日韩在线不卡| 一区二区免费在线播放| 欧美三级电影大全| av成人免费在线观看| 亚洲人体影院| 欧美精品入口| 在线亚洲欧美视频| 亚洲免费电影在线| 欧美特黄一级| 午夜精品999| 亚洲一区www| 国产精品一二三视频| 欧美一区午夜精品| 午夜视频精品| 国际精品欧美精品| 老司机免费视频一区二区| 久久伊人一区二区| 亚洲激情欧美激情| 亚洲精品日韩在线| 国产精品高潮呻吟久久av黑人|