2015-10-09 21 views
0

我在Matlab中編寫了兩個函數;一個求解輸入的階乘,另一個求解斐波那契數列的第n項。我現在正在爲每個函數設計一個腳本 - 一個計算歐拉數到10位小數,另一個計算互惠斐波那契數到10位小數。歐拉和斐波那契的近似腳本

Image here

我已經創建了階乘和Fibonacci序列以下兩個函數,分別。

function [ nfactorial ] = get_fact(n) 
%input a non-negative integer 
%output is factorial of that integer 
for i=0:n 
    nfactorial=prod(1:n); 
end 

function [ F ] = get_fib(k) 

if k < 0 
    fprintf('positive integer please') 
end 

k = k + 1; 
F(1) = 0; % 0th Fibonacci term 
F(2) = 1; % 1st Fibonacci term 
F(3) = 1; % 2nd Fibonacci term 
i = 4; 

while k >= i 
    F(i) = F(i-1) + F(i-2); 
    i = i + 1; 
end 
    F = F(k) 
end 

我怎麼會去把這些腳本?

我想:

for i = 0:n 
    e = prod(1/get_fact(i)) 
end 

但這返回的錯誤,顯然已經無法容忍設定,所以如果它的工作,這將是無限的。我從來沒有把一個函數放入腳本,所以任何幫助將不勝感激。

+0

你參加過這個matlab作業嗎?你的代碼有一些嚴重的語義問題。 –

+0

是的,我在那裏每班。一個函數或腳本的例子從來沒有在課堂上顯示......但這是分配的。 –

+0

那麼,*語法*你的功能會正常工作,所以你的腳本調用。問題在於*這些功能在多個層面上做錯了*。所以:如果你在每個班上都有,他們有沒有教過你什麼?如果他們教你什麼,你有沒有學過什麼? **提示**:如果你在'i'上的循環不包含任何'i',那麼你可能做錯了什麼。 –

回答

0

你的函數的語法和調用你的函數在每種情況下都可以。另一方面,你的功能有一些語義問題。

get_fact

function [ nfactorial ] = get_fact(n) 
%input a non-negative integer 
%output is factorial of that integer 
for i=0:n 
    nfactorial=prod(1:n); 
end 

prod(1:n)將成倍的數量從1n,看到help :help prod。所以它正好自己計算階乘!不需要循環遍歷i:您只需重複計算相同的內容。更嚴重的說明:get_fact(0)會給你0,它不應該。爲這種情況準備你的功能!

get_fib

function [ F ] = get_fib(k) 

if k < 0 
    fprintf('positive integer please') 
end 

k = k + 1; 
F(1) = 0; % 0th Fibonacci term 
F(2) = 1; % 1st Fibonacci term 
F(3) = 1; % 2nd Fibonacci term 
i = 4; 

while k >= i 
    F(i) = F(i-1) + F(i-2); 
    i = i + 1; 
end 
    F = F(k) 
end 

您打印一條消息,如果k<0,但你沒有做任何多餘的事後。這應該是一個錯誤信息,因此您應該使用error而不是fprintf,或者在fprintf之後寫F=NaN; return以過早地從該函數返回(沒有官方錯誤)。否則,這個功能對我來說似乎很好。

現在,如果你保存get_factget_fact.mget_fibget_fib.m某處你MATLAB路徑(始終包含當前目錄),你可以叫他們爲get_fact(3)和你嘗試過類似的get_fib()

但是你的電話也存在問題:

for i = 0:n 
    e = prod(1/get_fact(i)) 
end 

在這裏,你會爲每個i在每一個步驟改寫e再次e = prod(1/get_fact(i))打電話。你顯然不想要這個。您應該定義一個矢量來代替e並在最後對其內容進行求和,或者在每次迭代中不斷遞增標量爲e的值(但您必須將其初始化爲0)。而prod(1/get_fact(i))只會給你1/get_fact(i),因爲這個數量是一個標量。你需要以任何方式得到一筆款項,而且你必須以不同的方式來完成(見前幾句)。

老師所說的寬容與循環的截止點相關,在這裏你增加了e的值,即近似於無限和。首先,您可以採用近似值的給定最大順序,如果它按原樣工作,那麼您可以嘗試實現公差。