2016-11-14 18 views
8

Tham số của tôi, n là số điện thoại làm số nguyên.Xóa các phần tử của một số nguyên đệ quy

Sử dụng đệ quy Tôi muốn trả lại ba số đầu tiên trong số nguyên.

Tôi đã biến số nguyên thành danh sách các ký tự số riêng lẻ và tôi đang cố gắng xóa số cuối nhiều lần cho đến khi tôi rời khỏi ba số cuối, nhưng tôi bị kẹt về cách lặp lại nó.

def areaCodes(n): 
    n = str(n) 
    n = list(n) 
    del n[-1] 
    #n = reduce(opperator.add, n) 
    n = ''.join(n) 
    n = int(n) 
    return n 

Tôi biết tôi phải lặp lại tên này bằng cách nào đó, nhưng vì n không phải là số nguyên mà tôi có thể sử dụng để lặp lại. Tôi làm gì?

+0

Bạn có phải sử dụng đệ quy không? –

+0

Sử dụng vòng lặp while để lặp cho đến khi kích thước là ba – MichaelMMeskhi

Trả lời

0
import sys 

def areaCodes(n): 
#Create a list 
myList = list(str(n)) 
#Delete last element 
del myList[-1] 
#Combine your elements into string list 
myListStr = ''.join(myList) 
#Type cast to int 
myListInt = int(myListSte) 

#Check whether your list satisfies your condition 
if len(myList) > 3: 
    #Recusivley call the function again 
    return areaCodes(myListInt) 

#Return your list when recursion completes  
return myListInt 


n = 12345 
print areaCodes(n) 
+0

Vòng lặp phải có điều kiện 'len (n)> 3' nếu không nó sẽ kết thúc trong một vòng lặp vô hạn khi được cho đầu vào ngắn hơn' 3'. –

+0

Cái xấu của tôi sẽ sửa chữa nó – MichaelMMeskhi

+0

cách đệ quy này như thế nào? –

1

Tôi cho rằng đây là bài tập cần phải đệ quy. Nếu vậy, hãy thử này (có những cách tốt hơn để đạt được mục tiêu cuối cùng của bạn, nhưng tôi đã cố gắng để sửa đổi mã hiện tại của bạn càng ít càng tốt):

def areaCodes(n): 
    n_lst = list(str(n)) 
    del n_lst[-1] 
    n_str = ''.join(n_lst) 
    n_int = int(n_str) 
    if len(n_lst) > 3: 
     return areaCodes(n_int) 
    return n_int 

này sẽ gọi hàm một lần nữa nếu chiều dài của số này lớn hơn ba và trả về số khác. Về cơ bản, phần duy nhất bạn bị thiếu trong chức năng ban đầu của bạn là phần sau, đây là phần đệ quy:

if len(n_lst) > 3: 
    return areaCodes(n_int) 
2

Làm thế nào về điều này?

def areaCodes(n): 
    # if n is less than 1000, what does it mean about the number of digits? 
    if n < 1000: 
    return # fill... 

    # otherwise, if n is greater than 1000, how can we alter n to remove the last 
    # digit? (hint: there's an operation similar to division called f...r division) 
    return areaCodes(# operate on n somehow...) 
1

Hãy nhớ rằng đối với một chức năng để được đệ quy, nó sẽ có hai thuộc tính chính:

  1. Nó sẽ tại một số điểm gọi bản thân. (đây là những gì làm cho nó 'lặp lại')
  2. Nó sẽ có một số điều kiện dừng dừng (hoặc trường hợp cơ sở).

Bạn đã đề cập # 1 khi bạn viết rằng bạn đang sử dụng "tên trong sự trở lại", do đó, điều đó thật tuyệt! Bạn chỉ cần viết mã đó vào mã của mình:

return areaCodes(n), trong đó n là số điện thoại được cập nhật với số bị xóa.

Như bạn có thể thấy, mỗi cuộc gọi đệ quy nên thực hiện một số công việc hướng tới giải pháp và sẽ chuyển giải pháp mini của nó cho cuộc gọi đệ quy tiếp theo.

Cùng với # 2 ở trên, bạn cần chỉ định trường hợp cơ sở, nơi đệ quy sẽ ngừng. Vì vậy, kể từ khi bạn đang lấy đi một chữ số mỗi khi bạn gọi chức năng của bạn, bạn nên bao gồm một số loại kiểm tra để xem liệu đầu vào hiện tại là chiều dài mà bạn muốn.

Nếu số có độ dài phù hợp, bạn đã hoàn tất và bạn nên trả về số hiện tại (không phải một cuộc gọi đệ quy khác).

Nếu không, bạn chưa hoàn tất thao tác đệ quy.

Các vấn đề liên quan