gpt4 book ai didi

java - Java 中的 "repeat"结构

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:22 24 4
gpt4 key购买 nike

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

我们在 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++)

但是有两个问题:

  • 层叠式 for 循环需要两个变量:我认为我们对此无能为力
  • 我们收到警告,因为未使用变量 loop

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

再一次,我们只想在开始阶段提供一些“工具”,以便学生在对“变量”一无所知之前“重复” Action 。我们不会向他们隐藏不属于语言的内容,经过几次练习 (~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()

这个练习并不容易,但语法非常简单,让学生可以专注于“算法”部分而不是“语言”部分。经过几次练习后,学生们开始感兴趣了,我们可以介绍更多的语法和更难的概念,例如变量。

最佳答案

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

我同意初学者可能会对变量感到困惑 - 特别是它们的值可能一直在变化,这不是人们从代数中使用的东西,代数一旦“分配”值就不会改变。

如果你想使用 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(String[] 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;
}
}
}

但我更愿意使用一些自然支持这一点的语言。

关于java - Java 中的 "repeat"结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8861940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com