## problem in recursive function

on 1 Sep 2012

### Image Analyst (view profile)

hi,

I have recurrent function , this function has two outputs and each output will be input next in time. I built divide function, this function divide the input into two parts , and each one of the two parts will be input to same function and get two outputs and so on

```[a,b]=divede(c)
```

let divide whatever function

I need help to do that.

thanks

Walter Roberson

### Walter Roberson (view profile)

on 1 Sep 2012

Sounds like a recursive function rather than a recurrant function.

Sounds like a factoring problem.

huda nawaf

### huda nawaf (view profile)

on 1 Sep 2012

thanks,

let this function

```function [p o]=d(x)
%%x any vector of values
k=1;k1=1;
```
```for i=1:length(x)
```
`      if x(i)>median(x)`
`          s(k)=x(i);`
`          k=k+1;`
`      else`
`          s1(k1)=x(i);`
`          k1=k1+1;`
`      end`
`     end`
`   p=s;   o=s1;`
```end
```

what i need is,each of output will be the input to this function i.e [o p]=d(o) [o p]=d(p) each output will be input to this function and so on say do that for 5 times, in fact with my case i know the condition stop.

huda nawaf

### huda nawaf (view profile)

on 2 Sep 2012

yes, i mean recursive for image analyst I mean if I have

`    while ()`
`    [a b]=d(p)`
`    [a1 a2]=d(a)`
`    [b1 b2]=d(b)`
`    [a11 a22]=d(a1)`
`    [b11 b22]=d(b1)`
`    and so on `
`    end`

i have stop condition.

## Products

No products are associated with this question.

### Image Analyst (view profile)

on 2 Sep 2012

Here is some recursive code:

```% Demo to rotate an ellipse over an image.
% By ImageAnalyst
function [aboveMedian belowMedian] = test2(v)
% Initialize
aboveMedian = v;
belowMedian = v;
% Stopping condition.
if length(v) <= 1
return;
end
medianValue = median(v);
indexesAboveMedianVaue = v > medianValue;
aboveMedian = v(indexesAboveMedianVaue);
belowMedian = v(~indexesAboveMedianVaue);
% Stopping conditions.
if length(aboveMedian) <= 1 && ...
length(belowMedian) <= 1
return;
end
if length(belowMedian) == length(v)
return;
end
fprintf('For v = ');
fprintf('%f, ', v);
fprintf('\n   Median = %f', medianValue);
fprintf('\n   Values above median = ');
fprintf('%.1f, ', aboveMedian);
fprintf('\n   Values at or below median = ');
fprintf('%.1f, ', belowMedian);
fprintf('\n');
% Now recurse in with the two outputs
test2(aboveMedian);
test2(belowMedian);
```

It sort of does what you were trying to do with the median. Try it with this code:

```a=[2 3 4 56 7 85 3 5 7 7];
[am bm] = test2(a)
```

But it will quit early because I'm not really sure when you want to stop. What are your stopping conditions when you won't recurse in anymore? I don't have the right stopping conditions in there. Anyway, it's a start and I'll leave it up to you to finish. Good luck.

Image Analyst

### Image Analyst (view profile)

on 3 Sep 2012

Well keep working at it. I'm sure with the debugger, you'll figure it out.

huda nawaf

### huda nawaf (view profile)

on 4 Sep 2012

thanks image analyst, your code is very very help me to solve some problems in my code.

Now, I have another query related recursive function. I did modify for stop condition in above code:

```   Q_updat=(s1*B*s1')/2
if Q_updat<=0
return;
end```

now when Divide(G1) is running and test stop condition , and when met it will exit from code. How I can make the control of program go to Divide(G2),where stop condition stop the programm before raunning the secoind function. how solve this problem?

thanks

Image Analyst

### Image Analyst (view profile)

on 4 Sep 2012

I don't know. Maybe just check the stop condition again or output a variable called "keepGoing" that you set to true or false and can check.

### Azzi Abdelmalek (view profile)

on 1 Sep 2012
Edited by Azzi Abdelmalek

### Azzi Abdelmalek (view profile)

on 1 Sep 2012
``` n=5;c={rand(1,100)};
for k=1:5
c1=[];
for i1=1:length(c)
[a,b]=divede(c{i1})
c1=[c1 ;{a};{ b}];
end
c=c1
end```

```c{1},c{2} ,c{3}  % ...
```

huda nawaf

### huda nawaf (view profile)

on 2 Sep 2012

ok , what if place s=[] and s1=[]?

how my problem of recurrent will be resolved? is not there way to make each output as input and give me each time two outputs and repeat the process?

Azzi Abdelmalek

### Azzi Abdelmalek (view profile)

on 2 Sep 2012

that 's what the code i've posted i guess is doing. did you try it? if yes what is the problem?

Azzi Abdelmalek

### Azzi Abdelmalek (view profile)

on 3 Sep 2012

%maby we are not using the same function dived; s and s1 should be initialized

```function [p o]=dived(x)
s=[];s1=[]
k=1;k1=1;
for i=1:length(x)
if x(i)>median(x)
s(k)=x(i);
k=k+1;
else
s1(k1)=x(i);
k1=k1+1;
end
end
p=s;   o=s1;
```

the code using dived

``` n=5;c={rand(1,100)};
for k=1:5
c1=[];
for i1=1:length(c)
[a,b]=dived(c{i1})
c1=[c1 ;{a};{ b}];
end
c=c1
end```

```c{1},c{2} ,c{3}  % ...