1

私は個別の数学の授業でいくつかの問題を解いていて、私の注意を引いた演習を読んでいました (注: これは宿題ではありません。純粋に興味があるだけです)。

質問: 次のプログラム セグメントに対して "print" ステートメントは何回実行されますか? (i、j、k、m は整数):

for i := 1 to 20 do
    for j := 1 to i do
        for k := 1 to j do
            for m := 1 to k do
                print (i * j) + (k * m)

pythonでやろうとしたのですが、数秒でできたのでつまらなかったです。だから楽しみのために、スキームを言語として使用してDrRacketでそれをやろうとしました。ただし、ループに関するドキュメントを読んだ後、この種のループのリファレンスが見つからないようです。では、この特定の例 (または無限ループ数の一般的な例を推測します) を使用して、この問題をどのように解決できますか?

4

2 に答える 2

6

次のようなループ:

for i := 1 to 20 do
    for j := 1 to i do
        print [i, j]

次のようなループ範囲に1 to 201 から 20 までのすべての数値が含まれると仮定すると、Racket でこれと同等です。

#lang racket

(for* ((i (in-range 1 21))
       (j (in-range 1 (add1 i))))
  (displayln (list i j)))

上記は 1 つの入れ子になったループに限定されないことに注意してください。必要な数の入れ子になったループと反復変数を宣言できます。

于 2012-10-03T22:11:03.500 に答える
0

MIT スキーム:

(do ((cnt 0) (i 1 (+ i 1))) ((> i 20) cnt)
   (do ((j 1 (+ 1 j))) ((> j i)) 
     (do ((k 1 (+ 1 k))) ((> k j))
       (do ((m 1 (+ 1 m))) ((> m k)) 
         (set! cnt (+ 1 cnt))))))
;Value: 8855

doR5RS にあります。

しかし、これは実際には数学の問題であり、プログラミングの問題ではありません。

于 2012-10-03T23:08:48.160 に答える