Java中的“重复”结构

时间:2012-01-14 11:34:01

标签: java loops

我正在向初学者教授编程(从12-15岁开始),我们做出的选择之一(因为在Python中很自然)是在变量概念之前教授“重复动作”的概念

我们在Python中用

开始了
for loop in range(10):

没有谈论数组的变量和使用

的C ++
#define repeat(nb) for(int _loop = 0 ; _loop < (nb) ; _loop++)

我们的想法是隐藏经典循环的复杂性,以便坚持“重复”部分。我们并没有向学生们隐瞒“repeat(10)”不是C ++的一部分, 这只是简化学习的一种方式。

在Pascal中,我们做的不仅仅是

for loop := 1 to 10 do

但这没关系,因为它并不难记住。

我在Java中寻找类似的东西,我发现:

import java.util.List;
import java.util.AbstractList;

class Range {
    public static List<Integer> size(final int end) {
        return new AbstractList<Integer>() {
            @Override
            public Integer get(int index) {
                return 0 + index;
            }
            @Override
            public int size() {
                return end;
            }
        };
    };
}

public class Main {
     public static void main(String[] argv) {
    for (int loop : Range.size(10)) {
        System.out.println("xx");
    }
    }
}

for (int loop : Range.size(10))

更容易记住
for(int loop = 0 ; loop < 10 ; loop++)

但有两个问题:

  • imbricated for循环需要两个变量:我不认为我们可以做很多事情
  • 我们收到警告,因为未使用变量loop

您是否看到了我们拥有的更好的解决方案?

再一次,我们只想在开始阶段提供一些“工具”,以便学生在了解“变量”之前“重复”动作。我们并没有躲避那些不在语言中的人,经过一些练习(~80-100)之后,我们要求他们使用真正的语法。

<小时/> 在引入变量之前我们有大约20个练习:一些关于打印文本但是我们主要为一个库提供可以操作的对象(因此变量隐藏在对象状态中)。你可以想到“logo-turtle”。这样,“循环”的概念可以在引入显式变量之前被操纵和“看到”,并且您可以非常快速地进行实际动作。

一个例子,在Python中,您想要访问10x10表的每个案例一次,然后返回到您的起点(左下角):

from robot import *

top()
for loop in range(4):
   for loop in range(8):
      top()
   right()
   for loop in range(8):
      bottom()
   right()
for loop in range(8):
   top()
right()
for loop in range(9):
   bottom()
for loop in range(9):
   left()

这个练习并不容易,但语法非常简单,让学生专注于“算法”部分,而不是“语言”部分。 经过一些练习后,学生们会受到关注,我们可以引入更多语法和更难的概念,如变量。

5 个答案:

答案 0 :(得分:5)

你真的需要在这些练习中使用Java吗?如果其他语言适合您,那么为什么不使用它们呢?当学生知道变量等基础知识时,您总是可以转到Java。

我同意变量可能会让初学者感到困惑 - 特别是它们的价值可能会一直在变化,这不是人们从代数中使用的东西,其中价值观不会改变一次&#34;分配&#34;

如果你想使用Java,你可以使用似乎更合适的while循环。如何避免使用变量的一个肮脏技巧是遵循代码 - 它使用StackTraceElement而不是变量。

打印

Hello A
Hello B
Hello C
Hello C
Hello C
Hello B
Hello C
Hello C
Hello C
Hello A
Hello B
Hello C
Hello C
Hello C
Hello B
Hello C
Hello C
Hello C
Hello A
Hello B
Hello C
Hello C
Hello C
Hello B
Hello C
Hello C
Hello C

这是完整的来源。 main(Strinng [] args)方法是带循环的代码,其余是支持代码。

import java.util.HashMap;
import java.util.Map;

public class Repeater {

    public static void main(String[] args) {
        while(range(3)) {
            System.out.println("Hello A");
            while (range(2)) {
                System.out.println("Hello B");
                while (range(3)) {
                    System.out.println("Hello C");
                }
            }
        }
    }

    public static boolean range(int size) {
        return Range.range(size);
    }


    public static class Range {

        static Map<StackTraceElement, RangePosition> ranges = new HashMap<StackTraceElement, RangePosition>();

        public static boolean range(int size) {
            final StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            //System.out.println(stackTraceElement);
            RangePosition position = ranges.get(stackTraceElement);
            if (position == null) {
                position = new RangePosition();
                position.size = size;
                ranges.put(stackTraceElement, position);
            }

            final boolean next = position.next();
            if (!next) {
                ranges.remove(stackTraceElement);
            }
            return next;
        }

     }

    public static class RangePosition {
        int current,size;
        boolean next() {
            current++;
            return current <= size;
        }
    }
}

但我更喜欢使用一种自然支持这种语言的语言。

答案 1 :(得分:3)

我总是首先介绍变量。在没有变量知识的情况下,你打算在循环内做什么?

除此之外,使用while循环可能更容易。 while循环的头部更容易,不需要变量定义。 这很容易理解:

while (do_the_loop){
   //this is repeated
}

答案 2 :(得分:1)

Java确实不适合这种任务,因为它不允许传递函数。

我能想到没有变量的唯一方法就是使用接口:

private static void repeat(int times, DoStuff what) {
    for (int i = 0; i < times; i++) {
        what.doIt();
    }
}
private interface DoStuff {
    public void doIt();
}

然后以这种方式使用它:

repeat(5, new DoStuff() { public void doIt() {
            System.out.println("xx"); // whatever needs to be done
        }});

在没有变数的情况下,但在开始时会非常混乱。

答案 3 :(得分:1)

这不是你正在寻找的,但这是我的意见以及我将如何教它。 (小心,我根本不是老师:D)

是否有两种不同的课程:算法和编程?在编程中,你真的应该从教他们变量开始。这根本不难。而且我认为关于算法的20个练习对他们来说并不那么有趣。我认为他们会比计算内容更有吸引力。编写一个计算一些求和和乘法等的简单程序将会引入原始变量的概念。然后我会介绍for循环。通过将一些文本与for循环中使用的变量组合打印10次来演示:

for (int i = 0; i < 10; ++i)
    // Tell them that the 'i' is a variable as you explained before.
{
    System.out.println("This is line " + i);
}

然后编写一个计算硬编码的阶乘的应用程序将会很有趣,我想。这样,他们中的大多数人都希望能够使用变量。然后尝试解释范围。

int number = 5;
int factorial = 1;
for (int i = 1; i <= number; ++i)
{
    factorial = factorial * i;
}
System.out.println(number + "! = " +  factorial);

答案 4 :(得分:-1)

如果您定义了限制,则必须使用while结构

while(myval&lt; mylimit){

//做点什么

设为myVal ++; }

但是当限制是未知的时候,你应该使用for或for each

for(int i = 0; i&lt; list.size(); i ++) {

} 由对象

每个

(String myString:myStringArray){

}

Saludos