Bạn hoàn toàn đúng. -] Nó được gọi là "hàm đệ quy" và có thể RẤT hữu ích hoặc RẤT tệ tùy thuộc vào cách sử dụng
Chìa khóa làm cho công việc này hoạt động là “điều kiện kết thúc”
if n < 10:
return n
Nếu bạn không gọi điều này, mã của bạn sẽ lặp đi lặp lại mãi mãi và tự gọi nó là QUÁ, QUÁ và QUÁ lần nữa…
Một cái gì đó như thế này…
6+[7+[9+[0+[1+[0+[0+[0+[0+[.... Infinity ]]]]]]]]]]]]]]]
rất rất xấu xí
Hãy thử nó ở đây để xem ý tôi là gì.
Lỗi. Quá nhiều đệ quy có nghĩa là chức năng này đã tự gọi chính nó 5000 lần theo đúng nghĩa đen và quyết định “vặn cái này đi, cái này sẽ tồn tại mãi mãi. Tôi nghỉ việc”
Nếu bạn định gọi cùng một chức năng trong chính nó, hãy đảm bảo rằng bạn hoàn toàn có thể đảm bảo rằng có một điều kiện kết thúc hoặc bạn đang ở trong một thế giới bị tổn thương
NHƯNG…. nếu bạn kết thúc nó…
Vì vậy, nếu nó trừ đi một chữ số mỗi lần, bộ xử lý THỰC SỰ thấy nó như thế này…
chữ số_tổng = [6 +[ 7 + [ 9 + [ 0 + [ 1 ]]]]]
10976 % 10 = 6 + 1097 % 10 = 7 + 109 % 10 = 9 + 10 % 0 = 0 + 1 [Một chữ số nhỏ hơn 10 nên hàm ngừng gọi lại] Bằng 23
Giả sử, chúng ta được yêu cầu tạo một hàm nhận vào một số và tìm tổng các chữ số của nó một cách đệ quy cho đến khi tổng là một số có một chữ số
Ví dụ -
findSum[12345] = 1+2+3+4+5 = 15 = 1+5 = 6
Vì vậy, đầu ra phải là 6
Hãy viết mã cho hàm findSum[] này −
Thí dụ
// using recursion const findSum = [num] => { if[num < 10]{ return num; } const lastDigit = num % 10; const remainingNum = Math.floor[num / 10]; return findSum[lastDigit + findSum[remainingNum]]; } console.log[findSum[2568]];
Chúng tôi kiểm tra xem số đó có nhỏ hơn 10 hay không, nó đã được rút gọn chưa và chúng tôi nên trả lại số đó và từ hàm nếu không, chúng tôi nên trả lại lệnh gọi cho hàm đệ quy lấy chữ số cuối cùng từ số thêm vào cho đến khi nó nhỏ hơn 10
Hackerrank – Báo cáo sự cố
Có thể tìm thấy mô tả về sự cố trên Hackerrank
Giải pháp
Tạo một hàm đệ quy với điều kiện được mô tả - xem triển khai
Tôi đã tạo ra giải pháp trong
Tất cả các giải pháp cũng có sẵn trên GitHub của tôi
Scala
Giải pháp Scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nhập scala. io. Nguồn
đối tượng SuperDigit mở rộng Ứng dụng {
val dòng = Nguồn.stdin. bufferedReader[]. readLine[]
val nk = dòng.tách[" "]
val n = nk[0]
val k = nk[1].toInt
println[superDigit[n, k]]
def superDigit[num: Chuỗi, k. Int]. Chuỗi = {
nếu[num. độ dài == 1] {
return num
} else {
val sum. BigInt = num. foldLeft[BigInt[0 . ]][_ + Character.chữ số[_, 10]] * k
return superDigit[sum.toString, 1]
}
}
}