261 views (last 30 days)

Show older comments

Whenever I run the code for a matrix of n values, like n=1:10, only the last 2 factorials are displayed while the rest are 0's. Would anyone be able to tell me where I have gone wrong?

Code:

function x = fact(n)

if n<=1

x = 1;

else

x = n .* fact(n-1) ;

end

end

Titus Edelhofer
on 28 Jan 2015

Hi Arun,

your code does not work for arrays because of the "if n<=1". You would need to do something like

idx = (n>1);

x(~idx) = 1;

x(idx) = n(idx).* ...

Titus

Shubham Tyagi
on 15 Aug 2016

I'm compiling this code with a 2*4 matrix but (dimensions doesn't match in val(i)=r(i).*fact(r(i)-1);) type error is coming.

function val=fact(r)

i=(r>1); val(~i)=1; if r==1 return end val(i)=r(i).*fact(r(i)-1); end

Image Analyst
on 31 Jan 2015

Not sure what you did, but it worked fine for me. I put all this (both functions) into test.m

function test

clc;

for k = 1 : 10

kFactorial = fact(k);

fprintf('%d! = %d\n', k, kFactorial);

end

function x = fact(n)

if n<=1

x = 1;

else

x = n .* fact(n-1) ;

end

In the command window you'll see:

1! = 1

2! = 2

3! = 6

4! = 24

5! = 120

6! = 720

7! = 5040

8! = 40320

9! = 362880

10! = 3628800

Torsten
on 25 Aug 2016

Reshape everything to vectors and reshape back to matrices, if necessary.

Best wishes

Torsten.

Titus Edelhofer
on 25 Aug 2016

Hi,

two minor changes are needed:

function x = fact(n)

x = ones(size(n));

idx = (n>1);

if any(idx)

x(idx) = n(idx).*fact(n(idx)-1);

end

First, you need to initialize x as an array of the same size as n (because for fact(n-1) otherwise the array could be smaller), giving the error you observed.

Second, protect the recursive call to fact(n-1) by doing this only if there is anything to do...

Titus

Titus Edelhofer
on 26 Aug 2016

Calling for a matrix works fine, btw.:

fact([2 3 4; 5 6 7])

ans =

2 6 24

120 720 5040

Anil Sarode
on 26 Dec 2017

Edited: Walter Roberson
on 26 Dec 2017

sorry i copied your code :

this is the one way to solve your problem :

function file: from where you make function call each time using for loop :

n=1:10;

y=[];

for i=1:length(n)

y(i)=fact(i) ;

end

function: which do desire task

function [x] = fact(n)

if n<=1

x = 1;

else

x = n .* fact(n-1) ;

end

end

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!