I want to draw a histogram of 2-11 and each bar of the number would reach up to the chain length of that number.
I have a hailstone sequence as given below
but how can i draw a histogram of 2-11 and each bar of the number would reach up to the chain length of that number inside this hailstone sequence.
I have a hailstone sequence as given below
Code:
import string
# from graphics import *
from graphics import *
#Constant
MAX = 10000
# printing functions
# this function prints a brief description of the program to the user
# Inputs: none
# Outputs : none
def printGreeting():
print ""
print " This program finds hailstones sequences of numbers"
print " you choose. The next number in the sequence if found by"
print " either dividing it by two(if even) or multiplying by 3"
print " and adding 1(if odd).The program quits when the last"
print " number in the sequence is 1\n"
# this functions prints the menu for the user
# Inputs: none
# Outputs : none
def printMenu():
print "\n\tHere are your menu choices:"
print "\n\tI - view squence for an individual value\n"
print "\tR - veiw sequence for range of values\n"
print "\tL - Find the longest chain\n"
print "\tH - Print out the histogram\n"
print "\tQ - Quit\n\n"
# end of printing funtions
# hailstone(number) prints the hailstone sequence
# Inputs: number
# Outputs: none
def hailstone(n):
length = 1
print n,
# checks if n is not sential
while n != 1:
# if even, divide by 2 (rule). add 1 to length
if n % 2 == 0:
n = n / 2
print "->",n,
length = length + 1
# if odd, multiply by 3, add 1 (rule). add 1 to length
elif n % 2 != 0:
n = ( 3 * n ) + 1
print "->",n,
length = length + 1
# print the length at the end of each chain
print "; length =",length
print "----------------------------------------------------------------",
print "--------------\n"
return length
# this function returns the length of each chain from the starting number, n
# Inputs : n
# Outputs : none
def chain(n):
length = 1
while n != 1:
# if even, divide by 2 (rule). add 1 to length
if n % 2 == 0:
n = n / 2
length = length + 1
# if even, divide by 2 (rule). add 1 to length
elif n % 2 != 0:
n = ( 3 * n ) + 1
length = length + 1
return length
# getValidInt() prompts the user to enter an integer in the specified range,
# rejects values not in that range by requiring new input, and only returns
# a valid integer.
# Inputs: the question of the prompt,
# the minimum value in the range
# and the maximum value in the range
# Output: an integer in the specified range
def getValidInt(question, min, max):
# use a bad value to enter the loop
value = max + 1
# compose the prompt
prompt = question + " (" + str(min) + "-" + str(max) + "): "
# continue to get values until the user enters a valid one
while value == "" or value < min or value > max:
value = raw_input(prompt)
if len(value) != 0:
value = int(value)
# return a valid value
return value
# this function finds the longest chain
# Inputs: none
# Outputs : none
def longChain():
begin = "Please enter the begining integer for the range"
end = "Please enter the ending integer for the range"
# calls to getValidInt for starting and ending values
beginNum = getValidInt(begin, 1, MAX)
endNum = getValidInt(end, beginNum + 1, MAX)
largestChain = beginNum
for i in range(beginNum, endNum+1):
if largestChain <= chain(i):
largestChain = i
length = chain(i)
print largestChain, " had the longest chain ", length
# this function finds the longest chain***************************8
# Inputs: none*************
# Outputs : none
def histogram():
# initialize variables
longestLength = 1
list = []
start = input("Please enter the begining integer for the range: ")
for n in range (start, start + 10):
length = chain(n)
list.append(length)
if longestLength <= chain(n):
longestLength = n
length = chain(n)
print longestLength
print list
def main():
# prints the greeting to the user
printGreeting()
# prints the menu to the user
printMenu()
# asks user the menu choice
choice = raw_input("Please enter your choice : ").upper()
# checks to see if choice entered is from the menu
while choice != 'Q':
# if choice is "I" or "i", proceeds to follow the individual steps
if choice == 'I':
n = input("Please enter your integer (1-10000):")
hailstone(n)
# if choice is "R" or "r", proceds print each number and its sequence
# until the last number is 1, uses getValidInt to get valid integers
# for the function
elif choice == 'R':
begin = "Please enter the begining integer for the range"
end = "Please enter the ending integer for the range"
# calls to getValidInt for starting and ending values
beginNum = getValidInt(begin, 1, MAX)
endNum = getValidInt(end, beginNum + 1, MAX)
# for loop to get the values between starting and ending value
for n in range(beginNum,endNum+1):
#call to the hailstone function
hailstone(n)
# if choice is "L" or "l", proceeds to use getValidInt again to get the
# range, error checks on the range, and then calls the function chain
# to determine the length.
elif choice == 'L':
# call to function longchain
longChain()
elif choice == 'H':
histogram()
# if niether of the menu choices, then it prints that the
# entered text is not a valid choices
else:
print choice, "is not a valid choice"
# prints the menu to the user
printMenu()
# asks user the menu choice
choice = raw_input("Please enter your choice : ").upper()
main()
Comment