[英]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.