我正在努力掌握递归。任务:仅使用整数算术和递归,按直接顺序打印数字的所有数字,并用空格或其他分隔符分隔。不允许使用第三方软件包。我写并提出了这个解决方案:
package main
func main() {
rec(198, 0)
}
func rec(n, m int) (int, int) {
if n == 0 {
//убрать лишний ноль в конце перевернутого числа
m /= 10
//завершить выполнение когда все цифры числа будут выведены.
if m == 0 {
//функция перестает вызываться рекурсивно, когда все цифры выведены в прямом,
//по отношению к начальному числу, порядке.
return 0, 0
}
//вывести остаток от деления m на 10. Получаем последнюю цифру перевернутого числа
print(m%10, " ")
//убрать ту цифру которую уже вывели.
m /= 10
}
//рекурсивный переворот начального числа(делается в первую очередь)
//когда все разряды прибавлены к m и умножены на 10,
//получаем не цифры в обратном порядке, а именно перевернутое число.
//но в конце у него будет 0, его потом убираем внутри n==0 && m!=0
m += n % 10
//запускаем функцию с аргментом без последней цифры начального числа,
//которую уже включили в перевернутое число
//m умножаем на 10, как раз чтобы получить не просто цифры в обратном порядке а именно число.
//когда число будет переврнуто и функция провалится в условие n==0 && m!=0
//функция будет вызываться так же рекурсивно но с 0 в качестве обоих аргументов.
return rec(n/10, m*10)
}
但我怀疑,如果没有 n=0 && m!=0 的那部分条件,也可以做一些事情。但我还是不明白怎么做。如果你知道请告诉我。
更新:
package main
func main() {
rec(123456789098765432)
println()
}
func rec(n int) {
if n < 10 {
print(n)
} else {
rec(n / 10)
print(" ", n%10)
}
}
在这种方法中,递归调用的结果适用于堆栈原理还是什么?后进先出?首先,不会对其他所有实例执行打印,而是首先调用该函数的所有实例rec()
,然后才发生输出,但输出以与调用相反的顺序发生,rec()
但如果输出放在调用之前rec()
,则输出顺序将与呼叫直接相关,但与起始号码相反。
你正在做某事:
递归算法设计如下:
在您的情况下,递归的结尾是一个单位数。您只能用它做一件事 - 打印它并返回控制权。
现在谈谈行动。如果数字中有多个数字,那么您可以方便地通过除以 10 取余数来仅提取最右边的一位。这是执行操作的元素 - 使用分隔符打印。但是你需要从左到右打印,所以顺序也很明确——首先是递归,它会打印左边的数字,然后才打印最右边的数字。
该函数如下所示:
首先我们检查递归是否完成:
if n < 10 {}
。我们的递归以最左边的数字结束,因此我们不打印分隔符:现在是递归的主体:
检查数字 1(分隔符 -)、 10(分隔符 +)和 123(分隔符 /):https://go.dev/play/p/eXps2XXKLqO
作品))
附言。事实上,递归还有第三种选择——首先我们执行一半的操作,调用递归,然后执行后一半。但就您而言,这不是必需的。