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

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
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(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>
            亚洲国产高清一区| 欧美三级在线播放| 亚洲一区不卡| 免费久久99精品国产自| 欧美在线综合| 国产精品vvv| 亚洲人成网站色ww在线| 在线色欧美三级视频| 午夜在线精品偷拍| 亚洲一本视频| 欧美日韩亚洲综合一区| 亚洲啪啪91| 亚洲美女精品一区| 牛牛国产精品| 亚洲电影免费观看高清| 国产日韩一区二区| 午夜精品福利在线观看| 欧美尤物一区| 国产亚洲成精品久久| 先锋影音久久久| 久久国产主播精品| 国产欧美日韩视频一区二区| 亚洲一区二区综合| 欧美一区二区| 国产一区二区三区在线观看免费 | 午夜欧美不卡精品aaaaa| 欧美视频一区在线| 一区二区高清视频| 午夜欧美精品| 国内精品久久国产| 久久精品国产一区二区电影| 麻豆精品传媒视频| 亚洲国产精品尤物yw在线观看| 麻豆精品网站| 91久久在线播放| 亚洲一区二区三区免费视频| 国产精品国产三级国产a| 亚洲自拍偷拍网址| 久久综合图片| 亚洲免费av片| 欧美新色视频| 久久精品国产亚洲5555| 欧美福利一区| 亚洲性人人天天夜夜摸| 国产欧美精品| 免播放器亚洲一区| 日韩网站在线| 久久青青草综合| 亚洲精品视频在线观看免费| 欧美午夜理伦三级在线观看| 欧美一区午夜视频在线观看| 欧美a级片网站| 亚洲视频一区在线观看| 国产伦精品一区二区三区高清| 久久久久久久一区二区| 亚洲三级电影全部在线观看高清| 亚洲欧美日韩在线播放| 亚洲高清视频在线观看| 欧美日韩国产精品自在自线| 午夜亚洲性色视频| 亚洲精品老司机| 久久久91精品国产| 在线视频欧美一区| 狠狠色2019综合网| 欧美丝袜第一区| 免费观看亚洲视频大全| 午夜免费电影一区在线观看| 亚洲国产成人精品视频| 性久久久久久久| 日韩亚洲欧美在线观看| 好吊色欧美一区二区三区视频| 欧美女同视频| 久久婷婷国产综合精品青草| 亚洲视频在线观看免费| 欧美国内亚洲| 久久综合久久综合久久综合| 亚洲性线免费观看视频成熟| 亚洲激情六月丁香| 国产主播精品| 国产区精品视频| 欧美日韩一区二区视频在线观看| 欧美一区二区视频97| 最新成人av网站| 米奇777在线欧美播放| 性欧美xxxx视频在线观看| 99亚洲一区二区| 亚洲人妖在线| 亚洲韩国日本中文字幕| 国产曰批免费观看久久久| 国产精品久久久一本精品| 欧美第十八页| 欧美成人免费在线| 久久综合色婷婷| 久久久国产成人精品| 欧美专区日韩专区| 午夜在线电影亚洲一区| 亚洲免费视频中文字幕| 亚洲一区二区欧美| 日韩一本二本av| 99riav国产精品| 亚洲欧洲精品成人久久奇米网| 欧美91精品| 欧美高清hd18日本| 亚洲电影在线观看| 亚洲福利一区| 91久久久久久久久| 亚洲人体偷拍| 日韩一二三区视频| 亚洲午夜视频在线| 亚洲男同1069视频| 欧美在线三区| 久久精品一区二区三区四区| 久久久久国产成人精品亚洲午夜| 性做久久久久久久免费看| 欧美一区二区三区在| 久久久国产成人精品| 久久综合伊人77777麻豆| 欧美aaa级| 欧美日韩天堂| 国产美女高潮久久白浆| 黄色在线成人| 亚洲精品专区| 午夜精品久久久久99热蜜桃导演| 欧美一区二区| 女仆av观看一区| 亚洲茄子视频| 亚洲综合不卡| 久久九九电影| 欧美日韩国产影院| 国产欧美日韩视频| 亚洲第一精品电影| 亚洲夜晚福利在线观看| 久久免费偷拍视频| 亚洲激情视频在线| 亚洲字幕在线观看| 麻豆精品在线观看| 国产精品久久久久久影院8一贰佰| 国产网站欧美日韩免费精品在线观看| 亚洲高清免费在线| 亚洲一区三区视频在线观看| 久久久久久久综合狠狠综合| 亚洲国产精品专区久久| 国产精品99久久久久久久vr| 久久久久久一区二区| 欧美极品在线播放| 国产一区二区看久久| 日韩视频一区二区在线观看| 欧美在线观看天堂一区二区三区| 欧美成人精品三级在线观看| 亚洲一区二区高清视频| 蜜桃视频一区| 国产亚洲精品自拍| 一区二区三区视频在线看| 久久一区欧美| 亚洲一二三区视频在线观看| 你懂的成人av| 国产综合色在线视频区| 亚洲一区久久久| 亚洲福利视频二区| 久久精品国产精品亚洲精品| 国产精品久久久久久久久久妞妞 | 老色鬼久久亚洲一区二区| 国产精品va在线| 亚洲日本中文字幕免费在线不卡| 久久aⅴ乱码一区二区三区| 99av国产精品欲麻豆| 久久午夜精品| 一区二区三区在线视频观看| 欧美一级精品大片| 一区二区日韩伦理片| 欧美成人免费视频| 亚洲国产成人久久| 久久夜精品va视频免费观看| 亚洲无亚洲人成网站77777 | 亚洲电影有码| 久久久久久久欧美精品| 午夜欧美不卡精品aaaaa| 国产精品99免费看 | 日韩性生活视频| 欧美激情精品久久久久久大尺度| 极品av少妇一区二区| 久久精品视频免费观看| 亚洲欧美日韩国产一区| 国产精品实拍| 午夜视频在线观看一区二区三区 | 99视频在线观看一区三区| 欧美激情一区二区三区四区| 亚洲人体偷拍| 亚洲国产99| 欧美金8天国| 中文国产成人精品久久一| 亚洲精品久久久久久久久久久久久| 欧美成人69av| 一本高清dvd不卡在线观看| 亚洲日本成人| 国产精品高清一区二区三区| 午夜欧美精品久久久久久久| 亚洲一区二区三区免费观看| 国产女人精品视频| 久久人人爽人人|