Fibonacci系列递归c#方法

时间:2015-11-22 05:30:15

标签: c# recursion fibonacci

我很难写一个使用递归返回斐波纳契数列的方法。

我的迭代方法如下:

public class Map : MonoBehaviour {

public static int Row = 7;
public static int Col = 7;


private GameObject[,]boardPiece = new GameObject[Row,Col];

public GameObject prefab;
public GameObject prefab2;

void Start () {
    for (int i = 0; i < Row; i++) {
        for (int j = 0; j < Col; j++) 
        {
            if(i%2 ==1 && j%2 ==1 || i%2 ==0 && j%2 ==0)
            {
                boardPiece[i,j] = (GameObject)Instantiate(prefab, new Vector3(i*4.0f,0,j*4.0f),Quaternion.identity);
            }else{
                boardPiece[i,j] = (GameObject)Instantiate(prefab2, new Vector3(i*4.0f,0,j*4.0f),Quaternion.identity);
            }
            boardPiece[i,j].GetComponent<BoardPiece>().setRC(i,j);
        }

    }

}

    }

public class BoardPiece : MonoBehaviour {

private int rowPlace;
private int colPlace;

// Use this for initialization
void Start () {
    rowPlace = 0;
    colPlace = 0;

}

// Update is called once per frame
void Update () {

}

void OnMouseOver(){
    string message = "Row: " + rowPlace + " Col: " + colPlace;
    print (message);
}

 public void setRC(int R, int C)
{
    rowPlace = R;
    colPlace = C;
    print ("set " + rowPlace + "," + colPlace);
}

}

我希望将上面的方法更改为递归调用但具有相同的签名,即返回类型为字符串,它返回Fibonacci系列,例如0,1,1,2,3,5,8,13,21,34,55 < / p>

我用谷歌搜索,但我发现使用Console.WriteLine()完成了所有操作,即值被打印到屏幕但不会从函数返回为字符串。

由于

1 个答案:

答案 0 :(得分:2)

当然,网上有很多Fibonacci算法的例子,递归和其他方式。当然,递归实现的关键是从递归调用中获取结果,将其与当前结果相结合,然后将 返回给调用者。

因此,让我们从基本的Fibonacci想法开始,使用递归方法,只需在生成数字时写出数字:

void Fibonacci(int iMinus2, int iMinus1, int count)
{
    if (count == 0) return;

    int current = iMinus2 + iMinus1;

    Console.WriteLine(current);

    Fibonacci(iMinus1, current, count - 1);
}

那么问题是,我们如何调整上述内容以便它返回string而不是一次只写出一个数字。同样,请记住,关键是始终有办法将当前结果与先前调用的组合结果相结合。在这种情况下,这意味着我们希望将当前数字转换为字符串,并将该字符串前置到递归调用返回的字符串(在当前数字之后的所有数字

string Fibonacci(int iMinus2, int iMinus1, int count)
{
    if (count == 0) return null;

    int current = iMinus2 + iMinus1;
    string nextNumbers = Fibonacci(iMinus1, current, count - 1);

    return nextNumbers != null ?
        current.ToString() + ", " + nextNumbers : current.ToString();
}

注意:上面的内容比我建议的要复杂一些,因为它可以避免在没有下一个数字的情况下添加逗号。还有其他方法可以实现这一点,但我更喜欢实现递归方法,以便终止条件由被调用者而不是调用者处理。

我把它作为练习让读者处理上述问题,以及如何处理短序列(即简单的情况,其中一个人只看序列中的第一个或前两个数字)。 :)


注意:你的问题听起来很像家庭作业问题。如果是这样的话:这些在Stack Overflow上是合适的,但是我不能强调Stack Overflow不应该被认为是替代你的老师。我们很乐意为您提供有关家庭作业问题的建议和帮助,但与您的老师建立关系并寻求他们的建议非常重要,这样他们才能更好地了解您遇到麻烦的地方。