過去のように
Zeckendorff再帰アルゴリズムに関する記事を書きました:投稿
サンプルコード
def le_fib(limit, fib)
theoretical = fib[fib.count - 1] + fib[fib.count - 2]
return fib.last if theoretical > limit
fib << theoretical
le_fib(limit, fib)
end
def main(target,result)
temporary = le_fib(target, [1,1])
result << temporary
return result if target - temporary <= 0
main(target - temporary, result)
end
pp main(gets.to_i,[])
Le_fib 関数 -次の番号が入力されたターゲット番号より大きくならないように、制限のあるFibonacciシリーズを再帰的に検索します 。ここで重要なのは、Fibonacciシリーズ全体に関心があるのではなく、その終わりだけが重要なことです。
主な 関数-番号がフィボナッチ番号であり、一緒に入力番号を与える配列を再帰的に検索します。
実際には、コメントはよりエレガントな解決策を示唆していました:
1つのサイクルとビジネス
n, F = 100, [1, 2]
while F[-1] < n do
F << F[-2] + F[-1]
end
F.reverse.each do |f|
if f <= n
n -= f
print f
print '+' if n > 0
end
end
実際には、2番目のアルゴリズムを使用します。これは、不要なアクションによる過負荷が少ないためです。
「このアルゴリズムをプッシュする」問題ステートメント
比較的言えば、特定の製品セットがあります。
[鶏肉、トマト、ラバッシュ、マッシュルーム]。
これらの製品には、コストとエンドユーザーの価値の両方があります。
たとえば、グラデーションは次のように実行できます。
[チキン>トマト>マッシュルーム>ラバッシュ]。
, 1 "Low cost", 1 "High cost" .
().
( Ruby) , .
, .
x y .
-
[1,100]
[1,1000] Y - .
- , .
. Y
[1,143] 1 89. , "Middle cost" .
3 x = 1 y = 143.
, :
- ( )
Collector, Hash ( -> , -> )
, autoloader , .
, ,
@fib = [1,2,3,5,8,13,21,34,55,89]
def collect_the_items
food_hash = Hash.new
(0..9).each do |iterator|
food_hash[@fib[iterator]] = FOOD.first[iterator]
end
puts food_hash.map{|key,value| "#{key} - #{value}"}
end
, :
def get_sequence(limit)
result = [] n, fib = limit, [1, 2]
while fib[-1] < n do
fib << fib[-2] + fib[-1] end
fib.reverse.each do |f| if f <= n
n -= f
result << f
end
end
result
end
- .
def generate_food
food_array = Collector.collect_the_items
food = []
rarity = rand(1..143)
get_sequence(rarity).each do |key|
food << food_array[key]
end
food
end
, 6 , .
. - .
:
Low cost : ?
Mid cost : ?
High cost : ?
Zeckendorff表現アルゴリズムを適用することは私を完全に満足させます。つまり、割り当てられたタスクを実行します。
この実用的なアプリケーションが基づいている記事の下の最初のコメントの1つは、私に質問をしました:「しかし、本当に、これはどこに適用できますか?」ご覧のとおり、このアルゴリズムはそのようなタスクに使用できます。
そして、これが私のボットの製品リストを編集するための唯一の正しいオプションであると言っているわけではありませんが、それは本当に非常に機能的で機能します。