Code for 'Reverse a Vector'
이전 댓글 표시
v = [1 2 3 4 5];
w = reversal(v)
%-----------------------------------------------------------
function w = reversal(v)
persistent z;
s = size(v);
e = s(2);
z(e) = v(1);
if s(2) == 1
return
end
v = v(2:end);
reversal(v);
w = z;
end
% The problem is that i can't pass the random vector.
% Error says Variable w must be of size [1 9]. It is currently of size [1 15].
% Check where the variable is assigned a value.
% Test failed using v = [ -75 -22 57 13 -34 2 -94 -49 -11]
% Why does it work like this?
댓글 수: 1
Atif Penkar
2020년 8월 23일
Did you solve this one? I am stuck on this too, if you could help me out would be great..
답변 (6개)
Md Jawarul Moresalein Ayon
2020년 8월 28일
I have done this one,you may check it ---
function w=reversal(v)
s=length(v);
if s==1
w=v;
else
w(1,1)=v(end);
v=v(1:end-1);
w=[w(1,1),reversal(v)];
end
댓글 수: 11
Walter Roberson
2020년 8월 28일
That looks like it would work, but it could be more compact. For example,
w = v(end);
v = v(1:end-1);
w = [w, reversal(v)];
Which can be made even more compact.
Riya Sinha
2020년 8월 30일
What should be our approach if the input vector is very large? For ex: It contains up to a million terms? (v = 1:1e6)
I know that it can be solved quickly using iterative solutions, but i am not able to understand a recursive approach for reversing extremely large vectors. Any assistance would be highly appreciated. Thank you!
Walter Roberson
2020년 8월 30일
As I mentioned above,
Reverse of A B is reverse of B, followed by reverse of A.
Now suppose you let A be the first half of the current vector, and B be the second half of the current vector.
If you proceed in that manner, dividing the task into half each time, then 1e6 elements will need a recusion depth of only 20.
Riya Sinha
2020년 9월 2일
I have understood it. Thank you so much!
Hemanth Kumar Reddy Boreddy
2020년 9월 5일
Hello @Walter, i have tried with similar definition to flip a large vector of dgree 5. Doesn't know where am wrong but it doesnt work. Kindly have a look. Thaanks in advance.
k=v(end);
b=v(end-1:-1:ceil(length(v)/2));
k=[k reversal(b)];
s=v(ceil(length(v)/2));
h=v(1:ceil(length(v)/2)-1);
s= [s reversal(h)];
y=[k s];
Walter Roberson
2020년 9월 5일
Hemanth:
There are a number of things that are wrong with that code.
Firstly:
This is a question about using recursion, so to implement it correctly, you need to define a function that calls itself recursively.
Recursive functions mostly have the same general structure:
- they start by examining the inputs to determine whether the termination conditions have been met, and if so then return a direct computation of the inputs
- they do a computation on a part of the input
- they pass a modified version of the input to the function itself recursively (sometimes this is done before step 2)
- they combine the result of the recursive call with the calculation on part of the input, and return that
Every recursive function will have a conditional test, needed to determine whether the recursion is finished. A function that is intended to be recursive but which does not have a conditional test, will run forever (or until it crashes because you accessed an element that does not exist)
Secondly:
indexing at end-1:-1:ceil(length(v)/2) is reversing in itself, and that is not supposed to be done directly. You should be extracting parts but not reversing them, and passing the parts to the function recursively to do the reversal of
Thirdly:
You are breaking into three pieces, one of which is the last element, and the other two of which are halves of what is remaining after removing the last element. You should not be doing that. You should be working with exactly two pieces. Those two pieces could be halves, or the two pieces could be the last element and the rest of the elements.
Hemanth Kumar Reddy Boreddy
2020년 9월 6일
편집: Hemanth Kumar Reddy Boreddy
2020년 9월 6일
Hello walter, thanks for your reply and detailed explanation. Sorry for the incomplete code before, i have defined function but did not paste it here. As i need to reverse a very large vector, I have divided the vector into two halves,used recursive seperatly and tried to concatenate them at the end. Could you please suggest or modify. Thank you.Here is my function :
function y=reversal(v)
y=[];
if length(v)==1
y=v(1);
else
k=v(1:ceil(length(v)/2));
b=v(ceil(length(v)/2)+1 :end);
b=[b(end) reversal(b(1:end-1))];
k=[k(end) reversal(k(1:end-1))];
y=[b k];
end
end
Walter Roberson
2020년 9월 6일
Too much work. Just
function y=reversal(v)
y=[];
if length(v)==1
y=v(1);
else
k=v(1:ceil(length(v)/2));
b=v(ceil(length(v)/2)+1 :end);
y=[reversal(b) reversal(k)];
end
end
Bruno Luong
2020년 9월 6일
편집: Bruno Luong
2020년 9월 6일
Still too much work, and it does crash for empty input.
function v=reversal(v)
if length(v)>1
i = ceil(length(v)/2);
v = [reversal(v(i+1:end)) reversal(v(1:i))];
end
Hemanth Kumar Reddy Boreddy
2020년 9월 7일
Hey Walter and Bruno, thanks for the help. I was almost there but confused in the end. Thanks again
Micheal Omojola
2020년 11월 9일
편집: Micheal Omojola
2020년 11월 9일
@Bruno Luong. I have edited Walter's code, and it takes care of empty input:
function y=reversal(v)
y=[];
if length(v)==1
y=v(1);
elseif length(v) > 1
k=v(1:ceil(length(v)/2));
b=v(ceil(length(v)/2)+1 :end);
y=[reversal(b) reversal(k)];
else
return
end
end
Serhii Tetora
2020년 8월 13일
I had no this error with
v = [ -75 -22 57 13 -34 2 -94 -49 -11]
You can also use
w = flip(v)
It is same..
댓글 수: 1
Capulus_love
2020년 8월 13일
편집: Capulus_love
2020년 8월 13일
Mohamed Eid
2023년 2월 10일
편집: Mohamed Eid
2023년 2월 14일
This code solves the problem and passes all of test cases.
function v = reversal(v)
len = length(v);
if len > 1
len = fix(len/2);
left_be_right = reversal(v(1:len));
right_be_left = reversal(v(len + 1:end));
v = [right_be_left,left_be_right];
end
end
Walter Roberson
2020년 8월 13일
0 개 추천
That approach is wrong.
Reverse of A B is reverse of B, followed by reverse of A. When you let either A or B be a scalar then reverse of the scalar is the value itself. Therefore you can code each step with just a single recursive call and appending data.
xin yi leow
2021년 1월 25일
function v=reversal(w)
if length(w)==1
v=w(1);
else
v=[reversal(w(2:end)) w(1)];
end
end
댓글 수: 1
Rik
2021년 1월 25일
Your function will fail for empty inputs. The edit below fixed that and makes the function more compact.
function v=reversal(v)
if numel(v)>1
v=[reversal(v(2:end)) v(1)];
end
end
Rajith
2023년 12월 17일
function v = reversal2(v)
if length(v) > 1
ii = round(length(v) / 2);
v = [reversal2(v(ii+1:end)) reversal2(v(1:ii))];
end
end
카테고리
도움말 센터 및 File Exchange에서 Performance and Memory에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!