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

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 閱讀(474) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

常用鏈接

留言簿(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>
            欧美一区二区三区日韩| 亚洲视频你懂的| 久久精品成人| 国产伦精品一区二区三区在线观看 | 亚洲韩国青草视频| 欧美成人精品在线| 亚洲精品免费看| 欧美综合国产精品久久丁香| 久久久噜噜噜久久中文字幕色伊伊| 国产一区二区三区日韩| 久久久久国产免费免费| 91久久精品一区二区三区| 亚洲网站在线看| 黄色精品在线看| 欧美jizz19性欧美| 亚洲欧美综合v| 91久久精品久久国产性色也91| 最新高清无码专区| 一区二区高清| 亚洲国产婷婷香蕉久久久久久99| 亚洲午夜激情免费视频| 欧美在线视频全部完| 91久久视频| 国产在线视频不卡二| 欧美日韩精品综合| 久久久久一区| 欧美日韩精品一区二区三区| 国产视频亚洲| 国产精品免费在线| 欧美a级理论片| 国产精品永久免费| 亚洲精选大片| 亚洲欧洲美洲综合色网| 香蕉免费一区二区三区在线观看| 亚洲人成网站影音先锋播放| 亚洲一区二区伦理| 欧美大片免费观看在线观看网站推荐| 亚洲一区二区三区成人在线视频精品| 久久久久国产精品一区二区| 欧美一级视频精品观看| 欧美国产精品久久| 欧美一区二区三区精品| 欧美日韩中文字幕日韩欧美| 欧美日韩国产综合视频在线| 精品成人一区二区三区四区| 精品二区久久| 午夜精品久久久99热福利| 亚洲综合三区| 欧美一级在线播放| 亚洲色诱最新| 欧美高清在线观看| 久久久国产午夜精品| 你懂的国产精品| 国产精品久久久久久久app| 欧美 日韩 国产在线| 欧美精品在线免费| 欧美日韩色婷婷| 欧美日韩亚洲一区三区| 亚洲国产精品黑人久久久| 亚洲韩日在线| 久久综合久久综合久久| 欧美成人精品在线播放| 亚洲激情网站免费观看| 六十路精品视频| 欧美黄色小视频| 国产精品亚洲а∨天堂免在线| 国产欧美精品日韩精品| 伊人久久成人| 一区二区成人精品 | 欧美a级在线| 久久久久99精品国产片| 国产在线观看91精品一区| 久久精品在线视频| 久久久免费av| 日韩性生活视频| 久久gogo国模啪啪人体图| 亚洲一区二区三区四区五区午夜| 欧美亚洲系列| 黄色成人av在线| 欧美激情日韩| 午夜在线一区二区| 欧美激情视频给我| 国产精品入口尤物| 久久久www成人免费精品| 久久久天天操| 99精品视频免费观看视频| 一区二区成人精品| 国产亚洲精品激情久久| 欧美激情第3页| 欧美日韩在线免费视频| 久久久久九九九| 欧美电影电视剧在线观看| 亚洲综合国产激情另类一区| 欧美一区二区三区精品| 亚洲精选在线| 午夜精品在线看| 亚洲黄色成人久久久| 中文日韩在线视频| 欧美日韩一级大片网址| 欧美中在线观看| 欧美激情视频一区二区三区在线播放 | 久久久久国产一区二区三区| 欧美国产一区在线| 欧美一区二区三区在线免费观看 | 欧美成人激情在线| 国产精品vip| 亚洲日本成人网| 美女视频黄免费的久久| 中文亚洲视频在线| 伊人蜜桃色噜噜激情综合| 99在线精品视频| 欧美日韩综合精品| 欧美18av| 国产欧美成人| 99视频+国产日韩欧美| 在线看片成人| 欧美高清在线视频观看不卡| 国产精品久久亚洲7777| 亚洲国产一区在线| 亚洲高清不卡| 欧美一区成人| 午夜日韩电影| 欧美日韩在线视频一区| 日韩视频一区二区在线观看| 欧美日本韩国一区| 欧美国产精品va在线观看| 韩国女主播一区| 欧美一区二区三区视频免费播放| 99视频精品免费观看| 亚洲性图久久| 国产欧美亚洲精品| 亚洲一区二区精品| 宅男精品视频| 欧美性猛交xxxx免费看久久久| 亚洲国产老妈| 91久久香蕉国产日韩欧美9色| 久久久水蜜桃| 亚洲成在人线av| 欧美日韩国产综合视频在线观看 | 亚洲欧美清纯在线制服| 先锋资源久久| 久久精品国产99精品国产亚洲性色 | 亚洲精品极品| 欧美成人r级一区二区三区| 欧美大尺度在线| 99re国产精品| 国产精品啊啊啊| 亚洲欧美日韩在线不卡| 久久久久国产免费免费| 亚洲第一页中文字幕| 牛牛精品成人免费视频| 亚洲精品乱码久久久久久黑人| 一区二区三区欧美视频| 国产精品入口尤物| 久久久国产精品一区二区中文 | 一区二区三区国产精华| 亚洲欧美中文另类| 激情久久久久久久| 欧美国产日韩亚洲一区| 一区二区三区久久久| 久久精品国产亚洲aⅴ| 亚洲一区二区伦理| 国产日本欧洲亚洲| 欧美在线91| 欧美福利一区| 中文久久精品| 红杏aⅴ成人免费视频| 欧美电影免费观看| 亚洲在线播放| 欧美大香线蕉线伊人久久国产精品| 99精品视频免费观看| 国产视频一区在线观看一区免费| 久久亚洲电影| 欧美一区二区精品| 在线日韩视频| 国产精品video| 久久综合影视| 欧美1区2区视频| 亚洲综合日韩中文字幕v在线| 国内精品久久久久久久97牛牛| 欧美国产欧美亚洲国产日韩mv天天看完整| 一区二区冒白浆视频| 欧美国产日韩精品免费观看| 亚洲字幕在线观看| 亚洲免费播放| 激情综合色丁香一区二区| 欧美日韩国产区一| 久久久欧美精品sm网站| 亚洲小视频在线| 亚洲精品久久久久久久久| 麻豆久久精品| 影音先锋久久久| 国产精品电影观看| 欧美劲爆第一页| 久久久久在线| 性欧美精品高清| 亚洲午夜av在线| 夜夜嗨av色综合久久久综合网| 亚洲国产高清aⅴ视频| 99综合在线|