Я не уверен, что это ваше решение, но рекурсивная реализация есть (извините за использование Схемы - я балуюсь ею, поэтому я пытаюсь использовать ее на практике):
(define (bubble-digit-up number digit)
(if (= number 0)
digit
(let ((last-digit (modulo number 10)))
(if (= last-digit 0)
(* (bubble-digit-up (/ number 10) digit) 10)
(+ (* number 10) digit)))))
(define (shift-zeros-right x)
(if (<= x 0)
0
(let* ((last-digit (modulo x 10))
(rest (shift-zeros-right (/ (- x last-digit) 10))))
(bubble-digit-up rest last-digit))))
Функцияbubble-digit-up
получает два параметра: число и цифру.Перемещает цифру рядом с первой ненулевой цифрой.Например, (bubble-digit-up 100 4)
вернет 1400
.shift-zeros-right
- это основная функция, которая рекурсивно решает проблему: извлекает первую цифру, сдвигает нули оставшейся части вправо и помещает извлеченную цифру в нужное место.битовые операции (в соответствии с тегом), но это лучшее, что у меня есть.
РЕДАКТИРОВАТЬ: Если вы рассматриваете использование let
как мошенничество, здесь переменная безверсия:
(define (bubble-digit-up number digit)
(if (= number 0)
digit
(if (= (modulo number 10) 0)
(* (bubble-digit-up (/ number 10) digit) 10)
(+ (* number 10) digit))))
(define (shift-zeros x)
(if (<= x 0)
0
(bubble-digit-up
(shift-zeros (/ (- x (modulo x 10)) 10))
(modulo x 10))))
РЕДАКТИРОВАТЬ 2: реализация Python может быть проще следовать:
def bubble_digit_up(num, digit):
if num == 0:
return digit
else:
if num%10 == 0:
return 10*bubble_digit_up(num/10, digit)
else:
return 10*num + digit
def shift_zeros_right(x):
if x <= 0:
return 0
else:
return bubble_digit_up(shift_zeros_right(x/10), x%10)