面試題 f n1 n2 n3 n 求和

2021-09-26 01:23:06 字數 2819 閱讀 1995

源自前一期的面試題:最近一次前端面試題,有興趣的可以進去瞄瞄,看看自己掌握了多少。

2.題目描述:

編寫乙個函式,使得它能夠連續求和,如下所示

// 編寫函式f()

function f()

// f滿足以下要求

f(1) == 1

f(1)(2) == 3

f(1)(2)(3) == 6

f(1)(2)(3)(4) == 10

……

3.題目分析:(分析1)不論f函式如何工作,f的結果返回的必須是乙個函式,姑且叫做函式k;

(分析2)並且k也要返回乙個函式,否則無法連續呼叫,好像遞迴;

(分析3)因為是求和,所以f內部一定有乙個儲存和的變數,並且這個變數是儲存在記憶體中的,因此,這裡肯定要用到閉包;

(分析4)"==",右側是資料,左側是函式呼叫返回的函式,所以需要考慮型別轉換,否則無法相等

4.解題番外篇

下面我們先來寫兩個常規的函式,開拓一下思路:

// fun1,fun2函式滿足以下條件,預設x,y都是number型別,切非nan

// fun1(x) == x

// fun2(x)(y) == x+y

function fun1(x) 

function fun2(y)

}

仔細觀察fun2函式,是否是很符合「分析1」,它將是我們解題的基礎。

5.解題

下面我們將按照分析思路來一步一步的解答這個題目。

根據分析1:f是函式,並且返回函式k,我們可以得到函式f的架構如下

function f(x)

}

根據分析2:k也需要返回乙個函式m。我們再結合題目的描述,可以知道函式m所做的工作和函式k是一樣的,所以函式f調整如下

function f(x);

return k;

}

看到k函式,你大吃一驚「這不是遞迴嗎?」。它還真不是遞迴,因為它只是返回了自己,並非呼叫自己。到這一步,f函式已經可以進行一下連續呼叫了:

f(1); // 返回內部函式k

f(1)(2); // 返回內部函式k

f(1)(2)(3); // 返回內部函式k

f(1)(2)(3)……(n); // 返回內部函式k

注意,到目前為止,呼叫後返回的都是內部函式k。接下來我們先來看看分析4。

分析4:f函式每次呼叫後能夠與相應的數字進行比較(==),並且相等。而f呼叫完後返回的是k函式,也就是說「k==sum」,這裡就有個涉及了物件的隱式轉換問題,所以我們需要重寫tostring方法,是的tostring返回「和」。f函式完善如下

function f(x);

k.tostring = function()

return k;

}// 測試

f(1);  // 12

f(1)(2); // 12

f(1)(2) == 12; // true

經過了分析4,有沒有發現已經距離答案很近了呢。目前,我們只需要想辦法拿到「和」,並且把「12」替換成「和」返回是不是就ok了啊。我們繼續看看分析3。

function f(x);

k.tostring = function()

return k;

}// 測試

f(1);  // 0

f(1)(2); // 0

f(1)(2) == 0; // true

// 0 是**的呢,當然是lastsum裡面的啊,不信你改變lastsum試試看。

接下來我們需要處理一些細節了:

先看f(x) == x,這一步很簡單:呼叫f函式的時候,直接把lastsum初始化為f呼叫時的實參;

……

var lastsum = x;

……

接下來看連續累加:因為f呼叫後,返回的就是函式k了,所以說從第二個括號開始執行的就是k函式了,所以累加應該在k函式中,所以最終的f函式如下:

function f(x);

k.tostring = function()

return k;

}// 測試

f(6) == 6 // true

f(1)(2)(6) == 9 // true

f(11)(23)(6) == 40 // true

到最後,你會發現有個關鍵點很重要:f函式只在第乙個()的時候執行了,後面執行的都是內部的k函式。至此,f函式已經初步符合了題目的要求了,當然還有許多需要完善的地方,比如引數的校驗,也可以使用其他的方法替換tostring方法 等等。

6.總結

考察點:閉包的理解及應用、遞迴概念的理解、物件型別的隱式轉換,解題的思路等等等。

面試題 賽馬最快N匹

最近筆試遇見這個題,在網上看了一些回答大概理解了,現總結一下。理解有限,如有錯誤,還望大神指正!我的答案 最快7次,最慢10次 1.分5組比賽5次,得到排序 a1,a2,a3,a4,a5 b1,b5 c1,c5 d1,d5 e1,e5 2.第6次,取5組中,每組第1,比賽 a1,b1,c1,d1,e...

面試題10 1 n中1的個數

參考博文 主要就是從數字出發找規律。一 1的數目 程式設計之美上給出的規律 1.如果第i位 自右至左,從1開始標號 上的數字為0,則第i位可能出現1的次數由更高位決定 若沒有高位,視高位為0 等於更高位數字x當前位數的權重10i 1。2.如果第i位上的數字為1,則第i位上可能出現1的次數不僅受更高位...

面試題之輸入n求和為m的所有組合

揹包問題。問題 輸入兩個整數 n 和 m,從數列1,2,3.n 中 隨意取幾個數,使其和等於 m 要求將其中所有的可能組合列出來.分析 由該題可知是典型的揹包問題,根據該數是否加入進行遞迴運算。解法 採用0 1揹包的思想,使用遞迴方法 當選擇n時,就用剩下的n 1填滿 m n 當不選擇n是,就用剩下...