Преобразовать итерационную функцию в рекурсивную. Проверка на попарное различие цифр в числе - C (СИ)
Формулировка задачи:
bool T(int buf){
bool flag=true;
while(buf>0 && flag){
int x=buf%10;
buf/=10;
int bufb=buf;
while(bufb>0 && flag){
if(x==bufb%10)
flag=false;
bufb/=10;
}
}
if(flag)
return 1;
return 0;
}
Я гуглил.
Окей, упрощаем до "как задать рекурсию, чтобы она сравнивала значения каждого с каждым элемента массива?"
Решение задачи: «Преобразовать итерационную функцию в рекурсивную. Проверка на попарное различие цифр в числе»
textual
Листинг программы
UniqueDigits(long x)
{
unsigned short set = 0, temp;
while(x > 0)
{
temp = 1 << (x % 10);
if (set & temp)
return 0;
set |= temp;
x /= 10;
}
return 1;
}
Объяснение кода листинга программы
В данном коде представлена функция UniqueDigits, которая принимает на вход целое число x и проверяет, является ли это число уникальным по своим цифрам (то есть, нет ли в числе двух одинаковых цифр).
Внутри функции имеются следующие действия:
- Создается переменная типа
unsigned shortпод названиемset, которая инициализируется значением 0. Эта переменная будет использоваться для отслеживания уже встреченных цифр. - Создается переменная типа
unsigned shortпод названиемtemp, которая инициализируется значением 1 << (x % 10). Здесь%используется для получения остатка от деленияxна 10 (то есть, мы получаем последнюю цифру числаx). После этого с помощью сдвига вправо (>>) мы устанавливаем вtempзначение 1 в соответствующую позицию (если последняя цифра числаxравна 0, то вtempбудет установлен ноль, если 1, то единица, если 2, то двойка и т.д.). - Проверяется, есть ли в переменной
setзначение, установленное в переменнойtemp. Если да, то это означает, что в числе уже есть такая цифра, и функция возвращает значение 0. - Если в предыдущем шаге не было возврата, то значение
tempобъединяется с переменнойsetс помощью оператора|=. Это означает, что вsetустанавливается новое значение, равное текущему значениюsetс добавлением значенияtemp. - Значение
xделится на 10 с помощью оператора/=. Это означает, что мы удаляем последнюю цифру числаxи переходим к следующей. - Если все цифры числа были проверены, то функция возвращает значение 1. Таким образом, данный код проверяет уникальность числа по его цифрам. Если число уникально, то функция возвращает 1, если нет - возвращает 0.