簡體   English   中英

斐波那契程序未完成執行

[英]Fibonacci program does not complete execution

問題描述

通過考慮斐波那契數列中值不超過四百萬的項,找到偶值項的總和

程序

using System;

class fibonacci {
    // function to return Nth value of fibonacci
    public static long fibo_n(long N) {
        long fibon=0;
        switch (N) {
            case 1: fibon=1; break;
            case 2: fibon=2; break;
        }
        while(N>2) {
        fibon=fibo_n(N-1)+fibo_n(N-2);
        }
    return fibon;
    }
}    

class fibo_tester {
    static void Main() {
        int N=2;
        long sum=0;
        while(fibonacci.fibo_n(N) <= 13) {
            sum = sum + fibonacci.fibo_n(N);
            N=N+3;
        }
        Console.WriteLine("Sum is {0}: ", sum);
    }
}

我將測試的數量從原來的400萬減少到13,但是仍然掛起。 有人可以請教嗎?

編輯2

switch (N) {
        case 1: fibon=1; break;
        case 2: fibon=2; break;
        default: fibon=fibo_n(N-1)+fibo_n(N-2); break;
    }
 while(N>2) {
        fibon=fibo_n(N-1)+fibo_n(N-2);
        }

無限循環,N永遠不會在循環中更新。 您可能需要刪除While()子句並將其全部更改以return fibo_n(N-1)+fibo_n(N-2); 我不確定您在使用switch語句等做什么。但這應該是一個開始。

我實際上將其替換為此(如果您想使用該開關):

class fibonacci
{
    // function to return Nth value of fibonacci
    public static long fibo_n(long N)
    {
        switch (N)
        {
            case 0:
                return 0;
            case 1:
                return 1;
            default:
                return fibo_n(N - 1) + fibo_n(N - 2);
        }
    }
}   

您可能需要考慮將N的每個值的值存儲在字典或某種類型的集合中,以便以后查找它們。 由於在您的主程序中,您似乎將遍歷這些值(可能已經計算出了較大的N)。 我不確定主循環中的N + 3是什么,但是您可能會錯過那里的東西(遞歸中對N-1和N-2的錯誤假設?)

另外,如果求和並依賴於您的平台以及要測試的值的大小(測試您的第一個X斐波納契數的總和),您可能必須使用ulong或查找一些可以處理更大數字的數據類型。 如果我沒有在系統上將所有內容從長久更改為冗長的內容,那么這些值就會回繞。 無論如何,斐波那契數不能為負,所以為什么不使用ulong或uint64或更多位。

您同時使用循環和遞歸-您需要選擇一個或另一個。 您的代碼中的問題點在這里:

while (N>2) {
    fibon = fibo_n(N-1)+fibo_n(N-2);
}

在這個位置上, N的值實際上不會改變-這是在遞歸步驟中發生的。 編寫此代碼的一個示例(不好)方法是:

public static long fibo_n(long N) {
    if (N <= 0) return 0;
    if (N == 1) return 1;
    if (N <= 4) return N - 1;

    return fibo_n(N-1) + fibo_n(N-2);
}

祝你好運!


效果說明:

這不是一個好方法的原因是因為函數調用使用C#中的內存,而且它們也需要時間。 循環總是比遞歸快,在這種情況下,沒有充分的理由通過遞歸來解決這個問題(與簡單的循環相反)。 我將代碼保留不變,以便您可以與現有代碼進行比較,但是我認為您可以在其他地方找到更好的更好的代碼選項(盡管並非所有這些代碼都在C#中)。

假設您用等於3的N調用方法。

開關不執行任何操作。

N大於2,因此我們進入while循環。 while循環會執行某些操作; 它計算一個值,並將其分配給fibon 然后,由於N不變,它仍然大於2,因此我們再次對其進行了計算。 它仍然會大於2,因此我們再次進行了計算。 我們永遠不會停止計算它。

每次為fibon分配一個值時,您應該返回該值,因為操作已經完成。 您沒有什么可計算的。 也不需要while循環。 您永遠不需要執行該代碼一次以上。

你的實現也效率低下。 要計算fib(5),請計算fib(4)和fib(3)。 然后在計算fib(4)時,再次計算fib(3)和fib(2),當兩次計算fib(3)時,它們每次都計算fib(2)(因此是三倍),如果執行數學運算最終導致您在計算fib(n)時執行2 ^ n次計算。 最重要的 ,您正在調用fib n次,因為您在主循環中從零開始計數。 那就是無數次的工作和無數次的工作重新計算了相同的值。 如果只有一個簡單的循環將數字加在一起,則可以按N次計算的順序來計算結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM