【问题标题】:Function changing input功能改变输入
【发布时间】:2011-02-12 07:53:24
【问题描述】:

我想从一个号码转到另一个号码。例如,如果我从 6 开始,我的目标是 10,我想要一个函数,每次传球都会把我从 6 带到 10,或者如果我有数字 14,我的目标是 9,它会从 14 倒数到 9。到目前为止我有(这是在Processing a Java Api中写的,但与普通Java本质上没有区别,draw只是一个连续循环)

int x=100;
void draw(){
  x=towards(x,10);
  println(x);

}

int towards(int current ,int target){
  if(current!=target){
    if (current <target){
      current=current+1;
    }
    else {
      current=current-1;
    }
  }
  return current;
}

这给了我想要的结果,但我希望将所有内容都放在朝向()函数的一侧。当我用变量替换 X 时,它当然会将其自身重置为静态变量。

总结一下,我如何将变量传递给函数,并让传递的变量在每次后续传递时都发生变化。我已经将递归视为一种解决方案,但这只是将我带到了最终解决方案。我可以将计数传递给数组,但也不想这样做。

【问题讨论】:

    标签: java recursion function


    【解决方案1】:

    Java 总是按值传递int 参数。如果您想保持状态(尤其是可写状态),请将其保存在一个对象中,并(可能)使 towards() 成为该类的方法。

    【讨论】:

    • 那肯定行得通...Java 有什么类似于 Python 生成器的东西吗?我应该更频繁地将对象作为解决方案吗?每次我需要它时,我都不愿意为此创建一个对象。
    • Java 是一种 OO 语言,具有相当高效的内存分配系统,所以不妨使用它。 :-) 我见过 Python 生成器之类的东西,但如果您正在考虑使用生成器返回一系列值,那么创建 Iterator 可能会更简单。
    • @Doodle,对于生成器,请参阅我的解决方案;我创建了一个可以使用的范围迭代器。
    【解决方案2】:

    Java 使用按值传递,因此您不能更改参数(尽管如果参数是用户定义的对象,您可以更改参数指向的对象,但不能更改参数本身)。

    不过,您可能会考虑创建一个迭代器类型接口:

    // RangeIterator.java 公共类 RangeIterator 实现 Iterator { 公共 RangeIterator(int first, int last){ _first = 第一个; _last = 最后一个; 如果(_first _last; } 别的 { 返回 _first { 公共范围(int first,int last){ _first = 第一个; _last = 最后一个; 如果(_first 迭代器(){ 返回新的 RangeIterator(_first,_last,_step); } 私人 int _first; 私人 int _last; 私人 int _step; }

    使用上面的代码,您可以方便地编写如下内容:

    范围 range = new Range(x,100); 对于(int val:范围){ println(val); }

    由于我看到你来自 Python 背景,这应该很像:

    对于 xrange(x,100) 中的 val: 打印值;

    您可以实现IterableIterator 接口,以便提供您自己的生成器,可以在Java for-each 循环中使用。基本上,for (<i>Type</i> <i>identifier1</i> : <i>identifier2</i>) 遍历需要是 Iterable 类型的 identifier2 的内容,并在每次迭代时将当前元素分配给 identifier1。循环只是迭代 identifier2.iterator() 的语法糖。

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      相关资源
      最近更新 更多