功能改变输入

时间:2010-04-26 09:27:31

标签: java recursion function

我想从一个号码转到另一个号码。例如,如果我从6开始,我的目标是10,我想要一个函数,每次传球都会让我从6变为10,或者如果我的数字是14,我的目标是9,那么它将从14减少到9。我有(这是在处理Java Api中写的,但与regalr 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时,它当然会将其自身重置为静态变量。

总结一下,如何将变量传递给函数,并让每个后续传递的传递变量。我已经将递归视为一种解决方案,但这只是让我得出最终的解决方案。我可以将计数传递给数组,但也不想这样做。

2 个答案:

答案 0 :(得分:2)

Java使用pass-by-value,因此您无法更改参数(尽管如果参数是用户定义的对象,您可以更改参数指向的对象,但不能更改参数本身)。

但是,您可能会考虑的一件事是创建一个迭代器类型接口:

// RangeIterator.java
public class RangeIterator implements Iterator<Integer>
{
   public RangeIterator(int first, int last){
       _first = first;
       _last = last;
       if ( _first <= _last ){
           _step = 1;
       }else{
           _step = -1;
       }
   }

   public RangeIterator(int first, int last, int step){
       if ( step == 0 ){
            throw new IllegalArgumentException("Step must be non-zero.");
       }
       _first = first;
       _last = last;
       _step = step;
   }

   public boolean hasNext(){
       if ( _step < 0 ){
           return _first > _last;
       } else {
           return _first < _last;
       }
   }

   public Integer next(){
       int result = _first;
       _first += _step;
       return result;
   }

   public void remove(){
       throw new UnsupportedOperationException("Not implemented.");
   }

   private int _first;
   private int _last;
   private int _step;
}

// Range.java
public class Range implements Iterable<Integer>
{
     public Range(int first, int last){
       _first = first;
       _last = last;
       if ( _first <= _last ){
           _step = 1;
       }else{
           _step = -1;
       }
     }

     public Range(int first, int last, int step){
       if ( step == 0 ){
            throw new IllegalArgumentException("Step must be non-zero.");
       }
       _first = first;
       _last = last;
       _step = step;
     }

     public Iterator<Integer> iterator(){ 
           return new RangeIterator(_first,_last,_step); 
     }

     private int _first;
     private int _last;
     private int _step;
}

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

Range range = new Range(x,100);
for (int val : range){
    println(val);
}

由于我发现你来自Python背景,这应该感觉非常像:

for val in xrange(x,100):
    print val;

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

答案 1 :(得分:0)

Java 始终按值传递int个参数。如果你想保持状态(特别是可写状态),那么将它保存在一个对象中,并(可能)使towards()成为该类的方法。