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

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>
            日韩一区二区免费看| 一区二区三区蜜桃网| 久久久久久久久岛国免费| 欧美一级精品大片| 激情综合中文娱乐网| 欧美激情亚洲| 欧美日韩精品一区视频| 亚洲一二三区在线观看| 亚洲免费在线视频| 黑人中文字幕一区二区三区| 欧美波霸影院| 欧美日在线观看| 欧美一级欧美一级在线播放| 久久久国际精品| 99精品视频免费全部在线| 亚洲无亚洲人成网站77777 | 日韩视频一区二区| 国产日韩精品一区二区| 欧美成人视屏| 国产精品v日韩精品| 葵司免费一区二区三区四区五区| 免费欧美网站| 性视频1819p久久| 免费亚洲电影在线| 欧美一级成年大片在线观看| 老**午夜毛片一区二区三区| 亚洲在线中文字幕| 久久久久久综合| 亚洲欧美伊人| 欧美福利一区| 久久一区欧美| 国产欧美精品一区二区三区介绍 | 亚洲理论电影网| 欧美一区二区三区视频| 在线亚洲电影| 欧美 日韩 国产一区二区在线视频 | 在线欧美日韩国产| 亚洲一本视频| 一区二区久久久久| 毛片av中文字幕一区二区| 久久激情五月婷婷| 欧美午夜不卡在线观看免费 | 久久久久国产精品人| 国产精品国产三级国产普通话三级 | 黄色成人在线网站| 亚洲免费视频在线观看| 一区二区三区www| 美日韩精品视频| 久久亚洲二区| 免费高清在线一区| 欧美日韩亚洲一区二区三区在线观看 | 久久国产精品网站| 国产精品夫妻自拍| 一区二区成人精品 | 亚洲免费播放| 噜噜噜噜噜久久久久久91| 久久亚洲精品欧美| 激情五月***国产精品| 欧美一区二区私人影院日本| 欧美亚洲视频在线观看| 国产九九视频一区二区三区| 亚洲一品av免费观看| 亚洲一区尤物| 国产精品视频第一区| 亚洲在线成人| 久久久蜜桃一区二区人| 狠狠色伊人亚洲综合网站色| 欧美在线免费视频| 美女性感视频久久久| 原创国产精品91| 美女黄色成人网| 亚洲国产黄色片| 亚洲精品国产精品久久清纯直播| 欧美成人久久| 日韩特黄影片| 欧美在线黄色| 亚洲成在线观看| 欧美精品一区二区久久婷婷| 亚洲伦理久久| 先锋影音一区二区三区| 国内久久精品视频| 欧美www视频| 国产精品99久久不卡二区| 先锋a资源在线看亚洲| 国语自产精品视频在线看抢先版结局 | 亚洲韩国一区二区三区| 欧美高清免费| 亚洲午夜久久久久久久久电影院| 久久国产免费| 亚洲美女免费视频| 国产精品久久福利| 久久久久久久999精品视频| 亚洲激情一区| 久久国内精品自在自线400部| 伊人久久大香线| 欧美日韩一区二区高清| 欧美一二三视频| 亚洲人成毛片在线播放| 亚洲一区二区三区影院| 久久亚洲图片| 亚洲一区二区视频| 在线观看视频一区二区| 国产精品99一区二区| 久久久精品国产免费观看同学 | 久久久久国内| 亚洲精品国产拍免费91在线| 亚洲日本久久| 欧美一区二区三区精品 | 免费看的黄色欧美网站| 亚洲无玛一区| 亚洲高清免费| 欧美专区日韩视频| 99re6这里只有精品| 国产酒店精品激情| 欧美精品日韩一本| 久久精品国产亚洲高清剧情介绍| 亚洲欧洲精品一区二区三区波多野1战4| 午夜精品久久一牛影视| 亚洲日韩欧美视频一区| 国产一区二区三区在线观看网站| 欧美日韩一区二区三区在线视频| 久久久久久久久久久久久女国产乱 | 亚洲视频一区| 91久久中文字幕| 免费在线观看一区二区| 欧美在线视频一区| 亚洲午夜91| 99国内精品久久| 91久久精品www人人做人人爽| 国产亚洲一级高清| 国产毛片精品国产一区二区三区| 欧美日韩视频在线| 欧美精品一区二| 欧美极品影院| 欧美激情亚洲一区| 欧美岛国激情| 欧美第一黄网免费网站| 欧美88av| 欧美极品aⅴ影院| 欧美国产激情| 欧美精品黄色| 欧美日本中文字幕| 欧美日韩综合视频网址| 欧美视频一区二区三区在线观看| 欧美激情影院| 欧美午夜无遮挡| 国产精品视频男人的天堂| 国产精品久久久久久久久| 国产精品男人爽免费视频1| 国产精品美女主播在线观看纯欲| 欧美性大战久久久久久久蜜臀| 欧美午夜视频在线观看| 国产目拍亚洲精品99久久精品| 国产精品日韩久久久久| 国产一区二区三区四区五区美女| 国产一区二区三区黄视频| 韩日欧美一区| 亚洲精品五月天| 亚洲欧美成人综合| 久久久久久电影| 亚洲国产精品一区二区www在线| 亚洲人成毛片在线播放| 中文av一区二区| 欧美一区二区高清在线观看| 久久影院亚洲| 欧美精品九九| 国产精品影视天天线| 一区二区在线视频| 亚洲美女中出| 午夜精品久久久久久久99水蜜桃| 久久频这里精品99香蕉| 91久久在线| 欧美一区观看| 欧美激情小视频| 国内精品久久久久影院优| 亚洲精品黄网在线观看| 亚洲免费在线播放| 欧美福利视频在线观看| 亚洲精品欧洲精品| 亚洲精品在线三区| 欧美制服第一页| 最新精品在线| 日韩五码在线| 久久九九免费| 日韩午夜电影在线观看| 久久精品官网| 国产精品美女一区二区在线观看| 亚洲黄色一区| 久久精品夜夜夜夜久久| 日韩视频在线一区| 久久中文精品| 国产亚洲欧美中文| 亚洲一区亚洲| 亚洲国产综合在线看不卡| 久久99伊人| 国产精品毛片va一区二区三区 | 亚洲动漫精品| 久久精品色图| 国产日韩一区二区三区在线播放| 亚洲免费大片|