これは基本的にパズル解決です。インタビュー技術としてはそれほど生産的ではありませんが、それが事実であることを理解して、それを少しばかり扱うことは間違いありません。計画的プログラミング問題。インタビューの状況では、検索スペースにどのように近づいているのか、答えを吐き出すのではなく、何を考えているのかを非常に明確にしたいと考えています。この精神で
、私はもう少し会話的これに近づくだろう...かどうかa
の質問パー
は、初期値は任意であるならば、我々は何をするだろう、最初はゼロである必要がありますか?どのようにしてゼロになるのでしょうか?私たちが持っている唯一の計算命令は減算です...それでは、どのように保証されたゼロを得るのですか?よくX - X
は常にゼロですか?したがって、アキュムレータをゼロにする必要があれば、メモリ位置に格納し、アキュムレータから戻します。そのためのポスト条件はアキュムレータがゼロであることです。
ここから、1つまたは両方のメモリロケーションを一時ストレージとして使用するという制約があることがわかります。これはかなり大きな問題ですが、合成命令シーケンスにはtempとして1つのメモリ位置を使用し、もう一方は入力オペランドを使用するようにする必要があります。入力を壊さずにすべての操作を実装できるかどうかは疑問です。
最も簡単なはずの負荷から始めましょう。我々はしたい:
# zero a
STO a, memory2
SUB a, memory2
SUB a, memory1 # a == -memory1
# Save -memory1 and zero a again
STO a, memory2
SUB a, memory2 # a = 0
SUB a, memory2 # a = 0 - (-memory1)
LODがあります:
LOD a, memory1 # a = *memory1 -- destroys value in memory2
は試すことができます。より効率的になる可能性は十分ありますが、それはあなたを始めさせるはずです。
ADD a, memory1 # a = a + *memory1 -- destroys value in memory2
上記のように、私たちはX - (-Y) == X + Y
代数的等価を使用します。
STO memory2, a # save a, call this "original_a"
SUB a, memory2 # a = 0
SUB a, memory1 # a = -*memory1
SUB a, memory2 # a = -*memory1 - original_a
# Save -*memory1 - original_a, then zero a
STO a, memory2
SUB a, memory2
SUB a, memory2 # a = -(-*memory1 - original_a) == *memory1 + original_a
のように...答えメイトのため
乾杯 –