この広告は、90日以上更新していないブログに表示しています。
n はn-1とn-2を足した時に等しいとあるが、
例えば問題の時にそれを活用の為に閃く気が全くしないのと処理を見ても冗長すぎて今までの再帰となんか違う、演算子の計算よりも関数呼び出しの方が優先順位高い事は分かったけどなんかもう処理が多過ぎて嫌になってくる。
問題では1と2の数字の組み合わせのみでnになるには何通りかとあるが例えばnが4のときは3と2の時を足した結果だとヒントにあり、紙に書くと本当だ!フィボナッチ使える!となるが、問題を自分の頭で解決出来ないのが悔しいなと思う。そこから中上級者問題あるけどやりたくないが先行してしまう壁がある。
どういうパターンの時にこのフィボナッチの数式が思い浮かび当てはまるのだろう。想像がまるでできない。
ここから先は私の手に余るという事か
あればある。なければないの世界。
令和の虎を観ての感想。
令和の虎を観ると自分とどうしても比較してしまい、死にたくなるくらい自分という存在が恥ずかしくなる。そして絶望...これがsnsを消費しない方が良いという最大の理由なのだとも思った。
プランが甘くて怒られている人であっても対応できているし、必死に喰らい付いてしがみついていく。これが生きる上での渇望なのだと思った。喉が渇いたので水を下さいとは違うのだがそれと似たものを感じる。
その場でお金を取りに行っているという点で、それが必要なのであり、それが生命線でもあるのだから死に物狂いで頭が勤勉になり、あの手この手と必死に引き出しがなくなるまでアウトプットしていく様は観ていてどこか苦しくて残酷でこれが人間の世界なのだとも感じた。
このnを逓減させながら比較していくというパターンが引き出しの一部になった気がした。
今回は自然数nが素数であるかを再帰的に判定する関数を作る。これも文字列の圧縮のパターンを活用
出来た。引数は比較元をleft、比較対象をrightとして考える。
まず素数である7の時はどうしたいか
(7,6)(7,5)(7,4)と比較していrightが1になったら素数でありTrue
falseになる条件
自然数が6の時はどうしたいか
(6,3)の時、left % right == 0:と再帰途中で割り切れる時とleftが1の時。
そうでない時right -1して比較
trueになる条件
自然数が7の時はどうしたいか
rightが1までfalseの条件にかからない時、Trueを返し再帰終了というコードができました👏
ターミナルにて出力。
% python3 recursivelsPrime.py
True
False
False
True
縦xcm横 ycmの画用紙に最大サイズの正方形は幾つ作れるかの問題。
これを解決するには最大公約数GCDの概念を用いる
横168で縦60とすると
x% y
60の正方形が2個できて 余った横48センチ縦60センチの四角形ができる。
横48 で縦60とすると
y % x
縦が48の正方形が1個でき、余った縦12センチ横48の四角形ができる。
横48 で縦12とすると
x % y
この区間内での四角形は縦横12の正方形が4つできると言える。
この縦横12の正方形が最大の正方形であり、最大公約数という事である。
そして問題では何枚作れるかという事なので、縦 / 最大の正方形の一辺 * 横 / 最大の正方形の一片 で70枚となる。これの出力をメイン関数で行う
return GCD(y, x % y)
x とyの次はyとxの余りを計算するという事なので
xにyの値を入れて60,yには余った横48
xにyの値48 , 余りの縦12
xにyの値12, 余りの0(余りが(y ==0)になると再帰終了しxに12が入っているのでxを出力)
これがなんか分かりづらい。混乱してくる
コードは至ってシンプルである。
defmaxSquare(x, y):
return x // GCD(x, y) * y // GCD(x,y)
defGCD(x , y):
if y == 0: return x
return GCD(y , x % y)
print(maxSquare(60,168))
結果70が出力される
文字列の圧縮で学んだやり方を使うと
defgetGreatestDivisor(i):
return getGreatestDivisorHelper(i - 1 , i , '')
defgetGreatestDivisorHelper(right, left , output):
if right < 1: return output
if left % right == 0:
output += str(right) + ','
return getGreatestDivisorHelper(right - 1, left, output)
return getGreatestDivisorHelper(right - 1, left, output)
print(getGreatestDivisor(12))
ステップ1 iが12とするとgGDHelper(11, 12, '')から
if left % right != 0:なので
rightを-1し再び比較return gGDHelper(10,12, '')
rightを逓減し、比較する
以下略でrightが7の時までこの処理が続く、
ステップ2 gGDHelper(6,12, '')
if left % right == 0:
なので
output += str(right) + ','
(5, 12, '6')
(5, 12, '6,4')
(5, 12, '6,4,3')
(5, 12, '6,4,3,2')
(5, 12, '6,4,3,1,')となる。
0になると再帰終了でoutputを出力
結果6,4,3,2,1, となる。1の横のカンマはまあいいか
自然公園を歩く。最近では桜が綺麗に咲いていて満開でした。その周辺をうろうろする事で、滞っていた身体がどんどん足の末端からジワーッとしてくるのが分かり、身体の血の巡りが良くなり、それにより自律神経が整い、それにより良い汗が滝の様に体を伝い、それにより嫌でも前向きな気分になり、良い習慣の一つだなと感じました。これで驚くほど頭のモヤだったり、反芻が軽減してると感じました。
私は孤独であり、1人で歩くことは一見寂しそうにはみえますが、自然に囲まれながらこれからどうしようかと感覚を研ぎ澄ませながらユラユラ歩く事が、落ち着いてリラックスさせ、さらに冒険心を刺激して、頭をスッキリさせ、最適化できると気付きました。アインシュタインの気持ちが少し分かった気がして、シンクロしたような気分にもなりました。
自然に身体を預ける様に広い敷地を一周する。
私の好きな深煎りのコーヒーを片手に。
ああ贅沢ってコレだわ!は、きっといっぱいあって、見えにくい場所にひっそりと構えているモノなんだと、それがノイズの中に隠れてて探し出す事が難しい。きっと今はそういう時代なのだと痛感した。何かに執着したり依存すると桜が綺麗に映らなくなる様に。
探し方は結構簡単で
ステップ1抵抗のあることに目を向ける事。
ステップ2 またなるべく自己帰結させないという事です。
私は幸福は抵抗の先、人の役に立った時や小さな親切の後に訪れるモノだと思っていて、人生を振り返ってみると得体のしれないフワフワとした充実感は決まって、自己完結の後には現れなかった。部活の後だったり、お手伝いの後だったり,このブログのアウトプットの後などに一貫して訪れる。こういった自分で終わらせない工夫が必要なのだと思いました。
そして私は困難の先にも幸福があるのではないかとも思っていて、この幸福については得た経験があまりないので、ぜひたくさん味わう人生にできればしたい。
ステップ1 squareRoot(x):
return squareRootHelper(x, 1):近似値を1からスタート
ステップ2 squareRootHelper(x, 1):
ステップ3 newGuessに新しい近似値を代入する
√2はxを2乗した数である
近似値をx として正確な値ではないのでを≒を使う
x^2 ≒ 2
両辺を割るとx≒ 2 / x
バビロン学者は近似値と新しい近似値を平均する事によって答えに近づくと考えた
x`≒ (x + 2/ x) /2
近似値が1.4とすると
1.4 + 2/ 1.4
1.4 + 1.428571428571429
この1.4と1.428571428571429の間に答えはあると
newGuess = (guess + x / guess) / 2
ステップ4この新しい近似値と理論値の相対誤差が許容値内であれば
newGuessを出力する
if isSquareRootCloseEnough(newGuess, guess):return newGuess
そうでなければ近似値をnewGuessとし再帰呼び出しreturn sqareRootHelper(x, newGuess)
ステップ5相対誤差を求める関数の作成isSquareRootCloseEnough(a, b)
相対誤差の求め方は 測定値a + 理論値b / 理論値b
これをabs関数を使い、絶対値として出力し、%の数値にする。
今回は0.01%内に入っていることが条件。
return abs*1
Desktop % python3 squareRoot.py
近似値 : 1
新しい近似値 : 1.5
近似値 : 1.5
新しい近似値 : 1.4166666666666665
近似値 : 1.4166666666666665
新しい近似値 : 1.4142156862745097
近似値 : 1.4142156862745097
新しい近似値 : 1.4142135623746899
1.4142135623746899
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。