簡體   English   中英

給定N個步數和M個最大可能步數時,返回該人可以從0級到N級(更高)的可能序列總數

[英]When given N num of steps and M max possible steps return the total number possible sequences where the person can go (higher) from level 0 to level N

我覺得這與樓梯問題非常相似,在樓梯問題中您可以使用fibonacci遞歸調用,但是讓我失望的是M步驟的第二個參數,我不確定如何應用它。 救命?

我可以解決這個問題,類似於樓梯問題,后者只是一個fibonacci應用程序,然后使用該fib輔助函數進行過渡。

我似乎根本無法工作

 function numSteps(n, m) { if (n === 0) return 1 let begin = 0 let end = 1 let result = 0 for (let i = 1; i <= n; i++) { while (m < n) { result = begin + end begin = end end = result } } return result }; console.log(numSteps(2, 6)) function steps(n, m) { let table = new Array(n + 1).fill(false); table[0] = true; let total = 0 for (let i = 0; i < table.length; i++) { if (table[i] === true) { for (let j = 1; j <= m; j++) { table[j] = true total += 1 } } } return total; } 

生成器可能是解決JavaScript中置換和組合問題的最佳方法。 通過在紙上或在文本編輯器中逐步跟蹤評估,您將學到很多東西-

 const waysToClimb = function* (n, m, seq = []) { if (n > 0) for (let i = 1; i <= m; i++) if (i > n) return else yield* waysToClimb (n - i, m, [ i, ...seq ]) else yield seq } const result = Array.from (waysToClimb (10, 3)) console.log (JSON.stringify (result)) // [ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] // , ... // , [ 1, 3, 3, 3 ] // ] 

這是Ruby中的遞歸解決方案。

def steps(max_steps, steps_remaining)
   (1..max_steps).sum do |n|
     case n <=> steps_remaining
     when -1
       steps(max_steps, steps_remaining-n)      
     when 0
       1
     else
       0
     end
   end
end

steps(2, 4)
  #=> 5    
steps(3, 10)
  #=> 274
steps(5, 15)
  #=> 13624

require 'time'
t = Time.now
puts steps(8, 25)
16_190_208
(Time.now-t).round
  #=> 22 seconds 

在第一個示例中,5個可能的序列如下:

[[1,1,1,1], [1,1,2], [1,2,1], [2,1,1], [2,2]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM