2012-10-03 59 views
1

我正在为离散数学课解决一些问题,并阅读了引起我注意的练习(注意:这不是作业,我只是很好奇)。计划中的循环和迭代。

问题:为以下程序段执行“打印”语句多少次? (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使用方案作为语言。但是,在阅读循环文档后,我似乎无法找到这种循环的参考。因此,使用这个特定的例子(或者我猜一个具有无限循环次数的普通例子),这个问题怎么解决呢?

回答

6

甲环是这样的:

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

等效于此在球拍,假定看起来像这样的循环范围:1 to 20包括所有从1到数字(并包括)20.

#lang racket 

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

请注意,以上并不限于一个嵌套循环,您可以根据需要声明尽可能多的嵌套循环和迭代变量。

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 

do is in R5RS

但这确实是一个数学问题,而不是编程问题。