1. 程式人生 > >【LeetCode & 劍指offer刷題】發散思維題4:64 求1+2+…+n

【LeetCode & 劍指offer刷題】發散思維題4:64 求1+2+…+n

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

64 求1+2+...+n

題目描述

求1+2+3+...+n,要求 不能使用乘除法for、while、 if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。   /* 方法一:利用函式指標 !!n選擇函式return來終止遞迴 */ /* 聯絡
typedef struct {     double real;     double imag; }COMPLEX; */ typedef   int (* fun )( int ); // 定義函式指標型別, 方便使用 class Solution
{ public :     static int Sum_Solution ( int n )     {         static fun f [ 2 ] = { solution_teminator
, Sum_Solution }; // 靜態全域性變數只會被初始化一次         return n + f[!!n](n-1); //n 為非 0 時, !!n=1, n=0 時, !!n=0;n = 0 時執行 solution_teminator ,遞迴終止     }     static int solution_teminator ( int n )     {         return 0 ;     } }; /* 這裡把函式型別設定為 static 的原因 參考: 問題的原因其實就是函式引數不匹配的問題。因為我們普通的成員函式都有一個隱含的 this 指標,表面上看我們的謂詞函式 com ()只有兩個引數,但實際上它有三個引數,而我們呼叫 sort ()排序函式的時候只需要用到兩個引數進行比較,所以就出現了形參與實參不匹配的情況(函式有三個形參,但是隻輸入了兩個實參)。 所以,解決辦法就是把謂詞函式 com ()定義為 static 成員函式 */     /* 方法二:使用&&邏輯與的短路特性,前面為假,後面的不計算 利用短路特性終止遞歸向深處延伸 */ class Solution { public :      int Sum_Solution ( int n )     {          int ans = n ;          ans && ( ans += Sum_Solution ( n - 1 )); // 前面為 0 時,終止後面計算,遞迴結束          return ans ;      } };