2011-01-19 29 views
6

Tôi hiện đang sử dụng singpath.com để thực hành trên trăn của mình, nhưng tôi gặp sự cố với sự cố:Tìm hiểu xem a là sức mạnh của b

Số, a, là công suất của b nếu nó chia hết cho b và a/b là lũy thừa của b. Viết một hàm gọi là is_power lấy tham số a và b và trả về True nếu a là lũy thừa của b.

def is_power(a,b): 
    c = a/b 
    if (((a%b) == 0) and ((c%b) == 0)): 
     return True 
    else: 
     return False 

Đây là giải pháp của tôi nhưng hệ thống nhắc tôi khái quát hóa giải pháp của mình. Bất cứ ai có thể cho tôi biết whats sai với giải pháp của tôi?

+0

Bạn thực sự không cần ** dấu ngoặc đơn ** trong 'if'. Đó là 10 phím tắt không cần thiết khiến việc đọc mã khó hơn. –

Trả lời

0

Tôi sẽ không nói để khái quát hóa nó. Tôi sẽ nói để sửa nó vì nó không chính xác. Sử dụng giải pháp của bạn is_power (12,2) trả về True như is_power (18,3).

Tôi nghĩ rằng lý do mà hệ thống nói để khái quát hóa nó là nó có thể hoạt động đúng cho một số trường hợp thử nghiệm của họ, nhưng không phải là những trường hợp khác. Nó có khả năng là các trường hợp thử nghiệm mà nó đang làm việc là ngẫu nhiên những người mà nó sẽ làm việc nếu nó được mã hóa cứng theo một cách nhất định (chỉ kiểm tra quyền hạn của 2, ví dụ).

1

Bạn chỉ đang kiểm tra hai lũy thừa đầu tiên: số chia b và a/b chia b. Nó có thể là a = b ** 3 hoặc b ** 4 (hoặc b ** n nói chung), vì vậy giải pháp thực tế sẽ phải liên quan đến đệ quy hoặc vòng lặp.

0

Bạn đang kiểm tra liệu a/bchiab (trong biểu thức (c%b) == 0), chứ không phải là cho dù a/b là một sức mạnh củab. Gợi ý: Chức năng nào bạn sẽ gọi để xem liệu có gì đó là sức mạnh của b không?

0

Để hiểu được đệ quy, trước hết bạn cần phải hiểu đệ quy.

def is_power(a, b): 
    if a < b: # 3 is never a power of 10, right? 
     return False # prevent recursion 
    if a == b: # a is always a**1, right? 
     return True # prevent recursion 
    else: 
     return is_power(a/b, b) # recursion! 

Lưu ý rằng đối với số nguyên a/b sẽ cho bạn lỗi làm tròn. Hãy chắc chắn rằng bạn vượt qua phao.

+0

1 là sức mạnh của 5 mặc dù: p –

+0

Có, tôi phải bao gồm kiểm tra 'b == 0'. – 9000

+0

Ngoài ra, mỗi số dương là một công suất động của bất kỳ số dương nào ... vì vậy bạn không thể sử dụng phao nổi. –

0

Tôi không nghĩ bạn có triển khai đúng. Dựa trên các vấn đề, các is_power chức năng nên tìm một cái gì đó như thế này:

def is_power(a,b): 
    if a%b == 0 and is_power(float(a)/float(b), b): 
     return True 
    else: 
     return False 
8

Lý do lý do tại sao mã ban đầu của bạn không hoạt động như sau: Bạn chỉ cần kiểm tra (c%b) == 0) aka (a/b) is divisible by b, đó là yếu hơn nhiều so với phần a/b is a power of b của định nghĩa.

Khi bạn muốn giải quyết một vấn đề như vậy, bạn nên luôn bắt đầu với các trường hợp tầm thường. Trong trường hợp này, có hai trường hợp như vậy: is_power(x,x)is_power(1,x) - trong cả hai câu trả lời là True, vì x**1==xx**0==1.

Một khi bạn có những trường hợp này, bạn chỉ cần viết phần còn lại của định nghĩa. Viết mã cho (a is divisible by b) and (a/b is a power of b) và đặt tất cả lại với nhau.

Chức năng cuối cùng sẽ trông như thế này:

def is_power(a,b): 
    if <trivial case 1> or <trivial case 2>: 
     return True 
    # its a recursive definition so you have to use `is_power` here 
    return <a is divisible by b> and <a/b is a power of b> 

Câu hỏi duy nhất còn lại là làm thế nào để trả lời <a/b is a power of b>. Cách dễ nhất để làm điều này là sử dụng hàm is_power chính nó - đây được gọi là đệ quy.

+0

Đây là câu trả lời đúng cho vấn đề anh ta đang cố gắng giải quyết, nhưng đó không phải là câu trả lời cho câu hỏi của anh ta, đó là hỏi mã của anh ta sai, không phải cách viết mã khác giải quyết vấn đề. –

+0

Ok, tôi đã thêm giải thích thêm một chút. –

0

Bạn có thể sử dụng nhật ký.

import math 

def is_power(a, b): 
    return math.log(a, b) % 1 == 0 
+0

'math.log' có thể không ổn định về số. –

0
def is_power(a,b): 
    if a == b: 
     return True 
    if a % b == 0 and is_power(a/b,b): 
     return True 
    return False 

Điều kiện cuối cùng mà là một == b là rất quan trọng ở đây mà dừng lại khi cả hai số đều bình đẳng. Nếu điều này không được bao gồm, hàm có thể hiển thị False cho cả số hợp pháp bằng cách chia a/b trong lần lặp tiếp theo, cho phép 1 trong đó 1% b = 1, lần lượt trả về False thay vì True.

+2

Cố gắng đưa ra một số giải thích cho câu trả lời của bạn thay vì chỉ cung cấp một khối mã. Nó sẽ giúp người dùng khác hiểu câu trả lời thay vì sửa chữa một vấn đề được bản địa hoá. Cảm ơn! – Conner

+0

Ngoài ra, bạn nên xử lý trường hợp 'b' bằng 0 nhưng' a' không phải là vì sau đó 'a% b == 0' sẽ ném và ngoại lệ cho phép chia bằng 0 mà bạn không bắt được. – rbaleksandar

0

Bạn đang trả lời ràng buộc đầu tiên nhưng không trả lời lần thứ hai,
Bạn kiểm tra xem (a/b)%b == 0 đó là trường hợp đặc biệt của "(a/b) is a power of b". Therefor lỗi tổng quát (cố gắng nghĩ về khái quát rằng trường hợp cụ thể

gì bạn đã viết không phải là một giải pháp cho is power of ví dụ bạn sẽ thấy 12 như một sức mạnh của 2 từ:.

  • 12%2 = 0,
  • (12/2)%2 = 0

Nhưng điều đó rõ ràng là sai.

Như những người khác đã nói, hãy suy nghĩ về đệ quy (hoặc giải pháp vòng lặp ít thích hợp hơn).

0

Tôi chỉ đang làm việc về câu hỏi này, và đây là những gì tôi nghĩ ra.

Để viết điều này dưới dạng hàm đệ quy, bạn cần phần đệ quy và phần tầm thường. Đối với phần đệ quy, một số là sức mạnh của một số nếu:

((a%b)==0) and (is_power(a/b, b) # a is evenly divisible by b and a/b is also a power of b. 

Đối với trường hợp tầm thường, b là một sức mạnh của a nếu a=b.

Tuy nhiên, chúng tôi chưa hoàn tất. Vì chúng tôi đang chia cho b, chúng tôi phải thực hiện ngoại lệ khi bzero.

Và ngoại lệ khác là khi b = 1. Kể từ khi b=1, a/ba, chúng tôi sẽ kết thúc bằng đệ quy vô hạn.

Vì vậy, đặt nó tất cả cùng nhau:

def is_power(a,b): 
    # trivial case 
    if (a==b): return True 

    # Exception Handling 
    if (b==0) or (b==1): return False # unless a==b==0 or a==b==1, which are handled by the trivial case above 

    # recursive case 
    return ((a%b)==0) and (is_power(a/b,b)) 
0

Ví dụ này nên khắc phục vấn đề của bạn:

def is_power(a,b): 
if a == 1: 
    return True 
elif a%b == 0 and is_power(a/b, b) == True: 
    return True 
else: 
    return False 
+0

-1 cho mã dự phòng. Phần 'is_power (a/b, b) == True' là thừa. 'is_power (a/b, b)' đã trả về một giá trị boolean. –

0

Đây là giải pháp của tôi.

def is_power(a,b): 
if a == 1: # base case for recursion 
    return True 
elif b == 0 or a%b !=0 or a<b: # exception cases. 
    return False 
return is_power(a//b,b) # recursion 

Tôi đã thử nghiệm với nhiều trường hợp (16,2), (6,2), (1,2), (0,0), (0,1) và hoạt động tốt.

0

Một giải pháp đơn giản hơn nhiều là:

def is_power(a, b): 
    while a % b == 0: 
     a //= b 
    return a == 1 

Đệ quy là thực sự không cần thiết cho vấn đề này. Hơn nữa việc lặp lại có thể gây ra lỗi giới hạn đệ quy nếu a = b ** 1001.

+0

Mục đích của tuyên bố này là gì? a // = b – Kris1511

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