2013-03-01 1 views
2

저는 최근에 클래스가 파이썬으로 발전함에 따라 과제물 등급이 점점 낮아지고있는 것을 눈치 챘습니다. 누군가 내가이 코드 조각에 대해 잘못된 점을 알 수 있도록 도와 줄 수 있는지 궁금합니다. 왜 그들이 틀렸을까요? 긴 게시물 일 수도 있지만 앞으로 이러한 실수를 저지르는 데 도움이되는 도움을 주시면 감사하겠습니다.이전에 작성한 코드의 개정판을 찾으십시오.

def geometric(l): 
    'list(int) ==> bool, returns True if the integers form a geometric sequence' 
    res = False 
    if (l[1]/l[0]) == (l[2]/l[1]): 
     res = True 
    return res 

이것은 잘못된 것으로 간주 된 코드입니다. 코드가 말하듯이, int의리스트를 취해 그들이 기하학적 순서에 있는지의 여부를 리턴합니다. 내 책은 a1/a0이 a2/a1과 같으면 2, 4, 8, 16 등으로 잘 작동하는 시퀀스가 ​​기하학적이라고 말합니다.이 문제는 첫 번째 두 개의 인덱스 만 확인한다는 것을 깨달았습니다. 나머지 숫자는 무시합니다. 이 문제를 해결하려면 무엇을 쓸 수 있습니까?

def letter2number(grade): 
    '''string ==> int, returns the numeric equivalent to the letter grade, adding 0.3 if the grade contains a + 
    and subtracts 0.3 if the grade contains a -''' 
    res = 0 
    if 'F' in grade: 
     res = 0 
    elif 'D' in grade: 
     res = 1 
    elif 'C' in grade: 
     res = 2 
    elif 'B' in grade: 
     res = 3 
    elif 'A' in grade: 
     res = 4 
    if '+' in grade: 
     res += 0.3 
    elif '-' in grade: 
     res -= 0.3 
    return res 

이것은 잘못 생각한 것이 아니라 정확히 생각한 것보다 훨씬 길었습니다. 그가 파일에 쓴 코멘트는 "성적을 색인의 등급으로 설정했다"였지만 독립적 인 실험실 이었기 때문에 도움을 요청할 수 없었습니다. 각 학년에 목록의 가치를 부여하려고 시도했지만 정확하게 색인을 생성 할 수 없었습니다. 나를 위해 혼란 된

def leap(n): 
    'int ==> bool, returns True if the year is a leap year, False otherwise' 
    res = False 
    if n % 4 == 0 and n % 400 == 0 or not n % 100 == 0: 
     res = True 
    return res 

로 번역 if 문을 알아내는 '가 4로 나누어 있지만 400로 나누어 경우를 제외하고 100이 아닌 경우 올해는 윤년이다 ". 분명히 내가 쓴 것은 모든 홀수 숫자에 대해 작동하지만 실제로 그 이유를 파악할 수는 없습니다.

+0

'n % 4 == 0 및 n % 400 == 0 또는 n % 100 == 0 '은 (n % 4 == 0 및 n % 400 == 0) 또는 n % 100 = = 0'은'n % 4 == 0이 아니고 (n % 400 == 0 또는 n % 100 == 0이 아닙니다.)'올바른 것입니다. 즉, '및'은 '또는'보다 우선 순위가 높습니다. –

+0

이제 이것에 대해 생각해 봅니다. 아마도이 사이트는 http://codereview.stackexchange.com에 속해있을 것입니다. – abarnert

+0

사실, 이것은 확실히 [codereview.se]에 속하지 않습니다. [faq] (http://codereview.stackexchange.com/faq)에 따르면 문제 해결, 디버깅 또는 코드 스 니펫 이해에 대한 질문은 ** 주제 **에서 다루고 있습니다. – Adam

답변

1

문제의 절반 이상이 프로그래밍 문제가 아니지만 과제를 이해하는 데 문제가있는 것처럼 보입니다. 예 :

이것은 잘못된 것으로 간주 된 코드입니다. 코드가 말하듯이, int의리스트를 취해 그들이 기하학적 순서에 있는지의 여부를 리턴합니다. 내 책은 a1/a0이 a2/a1과 같으면 2, 4, 8, 16 등으로 잘 작동하는 시퀀스가 ​​기하학적이라고 말합니다.이 문제는 첫 번째 두 개의 인덱스 만 확인한다는 것을 깨달았습니다. 나머지 숫자는 무시합니다.

귀하의 코드는 귀하가 생각한 바대로 올바르게 구현되었습니다. 모든 인덱스 쌍을 검사하여 할당이 실제로 무엇인지 구현하지 않습니다. 당신이 알게되면 그건 당신이 무엇을해야하는지, 아마도 당신은 인덱스의 쌍을 비교하는 루프를 작성하는 방법을 알아낼 수있다 :

def geometric(l): 
    'list(int) ==> bool, returns True if the integers form a geometric sequence' 
    res = True 
    for i in range(len(l) - 2): 
     if (l[i+1]/l[i]) != (l[i+2]/l[i+1]): 
      res = False 
    return res 

을 그리고 당신은 당신이 첫 번째 실패에서 단락 일을 할 수 있음을 알 수 있습니다, 또는 모든 비율을 쌍으로 비교하는 대신 (첫 번째 쌍을 두 번 계산해야 함을 의미) 첫 번째 쌍을 비교하거나 한 쌍만 확인하고 모두 all을 사용하여 간단한 도우미 함수를 작성하여 모든 비율을 비교할 수 있습니다. 그러나 그것들은 모두 정교합니다.

다음

: 나를 위해 혼란 한로 번역 if 문을 알아내는

"는 4로 나누어 있지만 400로 나누어 경우를 제외하고 100이 아닌 경우 올해는 윤년이다". 분명히 내가 쓴 것은 모든 홀수 숫자에 대해 작동하지만 실제로 그 이유를 파악할 수는 없습니다.

당신 영어 andornot 일련의 단계로 그것을 번역하는 첫번째 필요. 네가 한 것은 "4로 나눌 수 있고 400으로 나눌 수 없거나 100으로 나눌 수 없다"는 것과 똑같은 것이 아닙니다.그런 다음 올바르지 않은 알고리즘을 올바르게 코딩했는데 도움이되지 않습니다.

"할 수 없다"를 "하지 말 것"으로, "하지 말 것"을 "또는 4로 표시하고 100으로 나눌 수 없거나 400으로 나눌 수 없습니다"로 번역하면됩니다. 그 코드에 번역에 대한 유일한 까다로운 부분은 "중"괄호 대신의 명령을 사용하는 것입니다 : 들어

if n % 4 == 0 and (not n % 100 == 0 or n % 400 == 0): 
+0

길이가 3보다 작은 시퀀스가 ​​'True'를 반환하기 때문에 기본 케이스가 'False'여야합니다. 물론 올바른 반환 값이 무엇인지 알 수 없습니다. 아마 예외 일 겁니다. –

+0

@StevenRumbalski : 예 :'all ([]) '과 비교하십시오. 일반적으로 무언가가 "모든 경우에 true ..."로 정의되고 "..."이 없다면, 그것은 사실로 간주됩니다. (그러나 OP가 그 문제를 제기하고 교수에게 그 사건에서 무엇을해야 하는지를 묻는다면 그것은 분명히 그의 성적을 해칠 수는 없을 것입니다 ...) – abarnert

+0

두 번째 질문에 대한 이야기가 곧 나오게됩니까? – Volatility

0

당신의 letter2number 내가 대신 매핑이 같은 처리하기 위해 사전을 사용하는 것입니다 :

def letter2number(grade): 
    G = {'F': 0, 'D': 1, 'C': 2, 'B': 3, 'A': 4} 
    D = {'+': 0.3, '-': -0.3} 

    if len(grade) == 2: 
     return G[grade[0]] + D[grade[1]] 
    else: 
     return G[grade[0]] 
관련 문제