#include <stdio.h>
/* This is a tail-recursive version :-D */
void shift_replace_rec(int *A, unsigned int len, unsigned int delta)
{
if (delta > 0)
{
unsigned int i = len-1;
/* Get the last element to eventually swap it with the first. */
unsigned int temp = A[i];
/* Shift everything one block to the right. */
for (; i > 0; --i)
{
A[i] = A[i-1];
}
/* Last element is now the first element. */
A[i] = temp;
/* Recurse! */
shift_replace_rec(A, len, delta-1);
}
}
void print_array(const int *A, const unsigned int len)
{
int i;
for (i = 0; i < 10; ++i)
{
}
}
int main(int argc, char *argv[])
{
int A[] = {0,1,2,3,4,5,6,7,8,9};
print_array(A, 10);
puts("Shifting by 3..."); shift_replace_rec(A, 10, 3);
print_array(A, 10);
puts("Shifting by 7... (Should be the original order now)"); shift_replace_rec(A, 10, 7);
print_array(A, 10);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovKiBUaGlzIGlzIGEgdGFpbC1yZWN1cnNpdmUgdmVyc2lvbiA6LUQgKi8Kdm9pZCBzaGlmdF9yZXBsYWNlX3JlYyhpbnQgKkEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBkZWx0YSkKewogICAgaWYgKGRlbHRhID4gMCkKICAgIHsKICAgICAgICB1bnNpZ25lZCBpbnQgaSA9IGxlbi0xOwoKICAgICAgICAvKiBHZXQgdGhlIGxhc3QgZWxlbWVudCB0byBldmVudHVhbGx5IHN3YXAgaXQgd2l0aCB0aGUgZmlyc3QuICovCiAgICAgICAgdW5zaWduZWQgaW50IHRlbXAgPSBBW2ldOwoKICAgICAgICAvKiBTaGlmdCBldmVyeXRoaW5nIG9uZSBibG9jayB0byB0aGUgcmlnaHQuICovCiAgICAgICAgZm9yICg7IGkgPiAwOyAtLWkpCiAgICAgICAgewogICAgICAgICAgICBBW2ldID0gQVtpLTFdOwogICAgICAgIH0KCiAgICAgICAgLyogTGFzdCBlbGVtZW50IGlzIG5vdyB0aGUgZmlyc3QgZWxlbWVudC4gKi8KICAgICAgICBBW2ldID0gdGVtcDsKCiAgICAgICAgLyogUmVjdXJzZSEgKi8KICAgICAgICBzaGlmdF9yZXBsYWNlX3JlYyhBLCBsZW4sIGRlbHRhLTEpOwogICAgfQp9Cgp2b2lkIHByaW50X2FycmF5KGNvbnN0IGludCAqQSwgY29uc3QgdW5zaWduZWQgaW50IGxlbikKewogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKICAgIHsKICAgICAgICBwcmludGYoIiVkIiwgQVtpXSk7CiAgICB9CiAgICBwdXRjaGFyKCdcbicpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBpbnQgQVtdID0gezAsMSwyLDMsNCw1LDYsNyw4LDl9OwogICAgcHJpbnRfYXJyYXkoQSwgMTApOwogICAgcHV0cygiU2hpZnRpbmcgYnkgMy4uLiIpOwogICAgc2hpZnRfcmVwbGFjZV9yZWMoQSwgMTAsIDMpOwogICAgcHJpbnRfYXJyYXkoQSwgMTApOwogICAgcHV0cygiU2hpZnRpbmcgYnkgNy4uLiAoU2hvdWxkIGJlIHRoZSBvcmlnaW5hbCBvcmRlciBub3cpIik7CiAgICBzaGlmdF9yZXBsYWNlX3JlYyhBLCAxMCwgNyk7CiAgICBwcmludF9hcnJheShBLCAxMCk7CiAgICByZXR1cm4gMDsKfQ==