>

저는 파이썬으로 지루한 것들을 자동화하여 파이썬을 배우고 있습니다. 그리고 초기 장을 진행하면서 저자의 목적과는 다른 것을 코딩하려고했습니다. 독물학 수업 중 교사는 한 종류의 달팽이가 매년 최대 12 %까지 죽어 가고 있다고 말했습니다. 그래서 코드를 계산하기로 결정했습니다.

내가 만든 코드는 다음과 같다 :

number= input('Number of individuals: ')  #tells the number of individuals in the beggining
count = 0 #tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ')  #% of individuals lost in each generation
percent=int(percent)
#while number > 1:
 #   number= number*(percent*0.01)
  #  number=round(number,-1)
   # count = count +1
    #print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
    #if number == 1:
     #   print(' it took ' + str(count) + ' generations to end with the species')

while True:
    if number == 1:
        print(' it took ' + str(count) + ' generations to end with the species')
    if number >1:
        number= number*(percent*0.01)
        number=round(number,-1)
        count = count +1
        print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
    if number == 0 :
        break

내가 시도한 첫 번째 코드는 주석으로되어 있으며 문제를 해결하기 위해 다른 방법을 시도했습니다.

내 문제는 : 개인 수와 손실 비율을 입력하고 싶습니다. 결국 (개인이 자신과 짝을 지을 수 없기 때문에 1), 나는 종으로 끝나는 데 필요한 세대 수를 말하고 싶습니다. 문제는 0 값을 원하지 않기 때문에 프로그램이 예상보다 한 번 더 반복 할 때 시작합니다 (라운드 () 함수를 사용하기 전에 더 많은 시간을 반복합니다) .1에 도달하면 원합니다. 몇 세대가 걸 렸는지 말해줘요.

답을 찾으려고했지만 초보자이기 때문에 올바른 검색을 수행 할 용어를 제대로 알지 못할 수 있습니다. 내가 보는 방식대로, 프로그램은 내가 원하는 것처럼 실행되어야하지만, 내가 얻지 못하는 것을 놓친 것 같습니다.


  • 답변 # 1

    이 코드는 더 나은 솔루션이므로 개선이 필요하기 때문에 주석으로 코드에 대해 논의 해 봅시다. 코드에 두 가지 주요 문제가 있습니다

    1) 왜 number * 0.1 를 인쇄합니까  그냥 number 대신 ? 10을 표시해야하는 경우 1이 표시되며 이것이 주요 문제이며 오해의 소지가 있다고 생각합니다.

    print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
    
    

    2) 다음 두 줄은 루프에 없어야합니다. 실제로 1을 통과하면 결과 메시지가 표시되지 않을 수 있기 때문입니다. 해당 줄은 루프 뒤에 배치해야합니다.

    if number == 1:
        print(' it took ' + str(count) + ' generations to end with the species')
    
    

    결과는 다음과 같습니다.

    number= input('Number of individuals: ')  # tells the number of individuals in the beggining
    count = 0 # tells the nuumber of generations
    number=int(number)
    percent=input('% of loss per generation ')  # % of individuals lost in each generation
    percent=int(percent) * 0.01
    while number > 1:
        number = number * percent
        number = round(number)
        count = count +1
        print('generation ' + str(count) + ':' + str(number) + ' individuals')
    print(' it took ' + str(count) + ' generations to end with the species')
    
    

    업데이트 :

    걱정하지 않으면 약간의 코드 스타일 개선 코드가 적용됩니다 :

    업데이트 # 2 :

    루프 만 수정했지만 @Alan이 주석에서 지적한 것처럼 손실을 잘못 계산합니다. 퍼센트는 1 - int(percent) * 0.01 여야합니다

    number = input('Number of individuals: ')  # tells the number of individuals in the beggining
    number = int(number)
    percent = input('% of loss per generation ')  # % of individuals lost in each generation
    percent = 1 - int(percent) * 0.01
    count = 0 # tells the nuumber of generations
    while number >= 2:
        number = number * percent
        count += 1
        print('generation {}: {} individuals'.format(count, round(number)))    
    print(' it took {} generations to end with the species.'.format(count))
    
    

    코드 https://repl.it/NWi4/2

    업데이트 # 3 :

    반올림을 개선하기 위해 코드 블록을 수정했습니다. 그것은 round(number, -1) 이었다 을 통해 수십 개의 반올림이 발생했습니다.

  • 답변 # 2

    이것을 살펴보십시오.

    number = input('Number of individuals: ')  # tells the number of individuals in the beggining
    count = 0  # tells the nuumber of generations
    number = int(number)
    percent = input('% of loss per generation ')  # % of individuals lost in each generation
    percent = int(percent)
    while number > 1:
        number = number * (1 - percent * 0.01)
        number = int(number)
        count = count + 1
        print('generation ' + str(count) + ':' + str(number) + ' individuals')
    print(' it took ' + str(count) + ' generations to end with the species')
    
    

    @Alans 제안 포함

    종료되지 않는 루프 문제는 개별 "사망"의 0.5보다 작은 끝 부분에 도달했기 때문에 발생했습니다. 당신의 round(number, -1) 와 함께  예를 들어 반올림 5 명중 0.3 명이 사망하여 4.7 명이 남았지 만 반올림으로 5 명을 다시 만들었다. 와이즈 비즈  반올림합니다.

  • 답변 # 3

    코드에는 두 가지 문제가 있습니다.

    <올>

    올바른 반올림--2와 같은 음수 값으로 반올림하려고합니다. 반올림하는 동안 양수를 사용해야합니다.

    반복 할 때마다 숫자 줄이기

    int(number)
    
    

    코드에서 두 가지 이상 만 변경하면됩니다.

    변경 후 코드 :

    number = number - number*percent*0.01
    
    

    출력 :

    number= input('Number of individuals: ')  #tells the number of individuals in the beggining
    count = 0 #tells the nuumber of generations
    number=int(number)
    percent=input('% of loss per generation ')  #% of individuals lost in each generation
    percent=int(percent)
    while True:
        if number <= 1:
            print(' it took ' + str(count) + ' generations to end with the species')
            break
        if number > 1:
            number = number - number*percent*0.01
            number = round(number,2)
            count = count +1
            print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
            print "Number is ",number
        if number == 0 :
            break
    
    

  • 답변 # 4

    이오 시프 세라 페 이미 디스 (Iosif Serafeimidis)의 답변에 따르면, 감소 금액이 1보다 작을 때까지 인구를 계속 줄입니다. 다른 사람들이 말했듯이 대답은 실제로 표현하고자하는 것에 달려 있습니다. NB 해당 round (number)는 int (number)와 달리 가장 가까운 정수로 반올림하며 그 다음으로 가장 낮은 정수로 반올림됩니다. 수정 된 버전은 다음과 같습니다.

    Number of individuals: "10"
    % of loss per generation "2"
    generation 1:0.98 individuals
    Number is  9.8
    generation 2:0.96 individuals
    Number is  9.6
    generation 3:0.941 individuals
    Number is  9.41
    generation 4:0.922 individuals
    Number is  9.22
    generation 5:0.904 individuals
    Number is  9.04
    generation 6:0.886 individuals
    Number is  8.86
    generation 7:0.868 individuals
    Number is  8.68
    generation 8:0.851 individuals
    Number is  8.51
    generation 9:0.834 individuals
    Number is  8.34
    generation 10:0.817 individuals
    Number is  8.17
    generation 11:0.801 individuals
    Number is  8.01
    generation 12:0.785 individuals
    Number is  7.85
    generation 13:0.769 individuals
    Number is  7.69
    generation 14:0.754 individuals
    Number is  7.54
    generation 15:0.739 individuals
    Number is  7.39
    generation 16:0.724 individuals
    Number is  7.24
    generation 17:0.71 individuals
    Number is  7.1
    generation 18:0.696 individuals
    Number is  6.96
    generation 19:0.682 individuals
    Number is  6.82
    generation 20:0.668 individuals
    Number is  6.68
    generation 21:0.655 individuals
    Number is  6.55
    generation 22:0.642 individuals
    Number is  6.42
    generation 23:0.629 individuals
    Number is  6.29
    generation 24:0.616 individuals
    Number is  6.16
    generation 25:0.604 individuals
    Number is  6.04
    generation 26:0.592 individuals
    Number is  5.92
    generation 27:0.58 individuals
    Number is  5.8
    generation 28:0.568 individuals
    Number is  5.68
    generation 29:0.557 individuals
    Number is  5.57
    generation 30:0.546 individuals
    Number is  5.46
    generation 31:0.535 individuals
    Number is  5.35
    generation 32:0.524 individuals
    Number is  5.24
    generation 33:0.514 individuals
    Number is  5.14
    generation 34:0.504 individuals
    Number is  5.04
    generation 35:0.494 individuals
    Number is  4.94
    generation 36:0.484 individuals
    Number is  4.84
    generation 37:0.474 individuals
    Number is  4.74
    generation 38:0.465 individuals
    Number is  4.65
    generation 39:0.456 individuals
    Number is  4.56
    generation 40:0.447 individuals
    Number is  4.47
    generation 41:0.438 individuals
    Number is  4.38
    generation 42:0.429 individuals
    Number is  4.29
    generation 43:0.42 individuals
    Number is  4.2
    generation 44:0.412 individuals
    Number is  4.12
    generation 45:0.404 individuals
    Number is  4.04
    generation 46:0.396 individuals
    Number is  3.96
    generation 47:0.388 individuals
    Number is  3.88
    generation 48:0.38 individuals
    Number is  3.8
    generation 49:0.372 individuals
    Number is  3.72
    generation 50:0.365 individuals
    Number is  3.65
    generation 51:0.358 individuals
    Number is  3.58
    generation 52:0.351 individuals
    Number is  3.51
    generation 53:0.344 individuals
    Number is  3.44
    generation 54:0.337 individuals
    Number is  3.37
    generation 55:0.33 individuals
    Number is  3.3
    generation 56:0.323 individuals
    Number is  3.23
    generation 57:0.317 individuals
    Number is  3.17
    generation 58:0.311 individuals
    Number is  3.11
    generation 59:0.305 individuals
    Number is  3.05
    generation 60:0.299 individuals
    Number is  2.99
    generation 61:0.293 individuals
    Number is  2.93
    generation 62:0.287 individuals
    Number is  2.87
    generation 63:0.281 individuals
    Number is  2.81
    generation 64:0.275 individuals
    Number is  2.75
    generation 65:0.269 individuals
    Number is  2.69
    generation 66:0.264 individuals
    Number is  2.64
    generation 67:0.259 individuals
    Number is  2.59
    generation 68:0.254 individuals
    Number is  2.54
    generation 69:0.249 individuals
    Number is  2.49
    generation 70:0.244 individuals
    Number is  2.44
    generation 71:0.239 individuals
    Number is  2.39
    generation 72:0.234 individuals
    Number is  2.34
    generation 73:0.229 individuals
    Number is  2.29
    generation 74:0.224 individuals
    Number is  2.24
    generation 75:0.22 individuals
    Number is  2.2
    generation 76:0.216 individuals
    Number is  2.16
    generation 77:0.212 individuals
    Number is  2.12
    generation 78:0.208 individuals
    Number is  2.08
    generation 79:0.204 individuals
    Number is  2.04
    generation 80:0.2 individuals
    Number is  2.0
    generation 81:0.196 individuals
    Number is  1.96
    generation 82:0.192 individuals
    Number is  1.92
    generation 83:0.188 individuals
    Number is  1.88
    generation 84:0.184 individuals
    Number is  1.84
    generation 85:0.18 individuals
    Number is  1.8
    generation 86:0.176 individuals
    Number is  1.76
    generation 87:0.172 individuals
    Number is  1.72
    generation 88:0.169 individuals
    Number is  1.69
    generation 89:0.166 individuals
    Number is  1.66
    generation 90:0.163 individuals
    Number is  1.63
    generation 91:0.16 individuals
    Number is  1.6
    generation 92:0.157 individuals
    Number is  1.57
    generation 93:0.154 individuals
    Number is  1.54
    generation 94:0.151 individuals
    Number is  1.51
    generation 95:0.148 individuals
    Number is  1.48
    generation 96:0.145 individuals
    Number is  1.45
    generation 97:0.142 individuals
    Number is  1.42
    generation 98:0.139 individuals
    Number is  1.39
    generation 99:0.136 individuals
    Number is  1.36
    generation 100:0.133 individuals
    Number is  1.33
    generation 101:0.13 individuals
    Number is  1.3
    generation 102:0.127 individuals
    Number is  1.27
    generation 103:0.124 individuals
    Number is  1.24
    generation 104:0.122 individuals
    Number is  1.22
    generation 105:0.12 individuals
    Number is  1.2
    generation 106:0.118 individuals
    Number is  1.18
    generation 107:0.116 individuals
    Number is  1.16
    generation 108:0.114 individuals
    Number is  1.14
    generation 109:0.112 individuals
    Number is  1.12
    generation 110:0.11 individuals
    Number is  1.1
    generation 111:0.108 individuals
    Number is  1.08
    generation 112:0.106 individuals
    Number is  1.06
    generation 113:0.104 individuals
    Number is  1.04
    generation 114:0.102 individuals
    Number is  1.02
    generation 115:0.1 individuals
    Number is  1.0
     it took 115 generations to end with the species
    
    

  • 답변 # 5

    먼저 살아있는 달팽이 수를 잘못 계산했습니다. 모든 반복 달팽이에는 살아있는 달팽이가 (100 %-손실 %) * 개가 있어야합니다. 두 번째는 조건과 라운드 기능입니다. 예를 들어, 반올림 후 이전 숫자를 낮추기에 손실이 충분하지 않은 지점에서 코드가 문제가 될 수 있습니다. 4 * 0.88 = 3.52. 반올림 후 다시 4입니다. 따라서 문제의 성격에 따라 반올림에서 사임하거나 대신 바닥을 사용할 수 있습니다. 질문은 달팽이 0.52를 어떻게 다룰까요?

    12 %의 손실과 100 명의 개인의 경우 반올림없이 종을 끝내려면 37 세대가 걸렸고, 바닥을 사용할 때 종을 끝내려면 24 세대가 걸렸습니다.

    아래 코드가 작동합니다.

    number = input('Number of individuals: ')  # tells the number of individuals in the beginning
    count = 0  # tells the nuumber of generations
    number = int(number)
    percent = input('% of loss per generation ')  # % of individuals lost in each generation
    percent = int(percent)
    while number > 1:
        reduction = number * (percent * 0.01)
        if reduction < 1:
            print('No further reductions possible')
            break
        number = round(number - reduction)
        count = count + 1
        print('generation ' + str(count) + ':' + str(number) + ' individuals')
    print(' after ' + str(count) + ' generations, there were ' + str(number) + ' individuals')
    
    
    import numpy as np while True: if number <= 1: # <= covers values below 1 print(' it took ' + str(count) + ' generations to end with the species') break; if number > 1: number = number*(1-percent*0.01) # number left is 1 - minus loss percent # number = np.floor(number) # optional floor count = count + 1 # print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')

관련 자료

  • 이전 visual studio code - 파일, 유형 등을 검색하기위한 VSCode 쿼리 형식
  • 다음 php - 중첩 된 키 laravel mongodb jenssegers와 일치하는 레코드를 찾는 방법