Python - The Collatz SequenceProject Euler #14 (Longest Collatz sequence)Project Euler #14 — longest Collatz sequenceHailstone Sequences in PythonPython program for testing the Collatz ConjectureProject Euler: Longest Collatz SequenceCounting terms in Collatz sequences until 1 is reached or a limit is exceededAutomate the Boring Stuff - Collatz ExerciseComputational verification of Collatz conjecture

Can planetary bodies have a second axis of rotation?

How do rulers get rich from war?

Is there an in-universe reason Harry says this or is this simply a Rowling mistake?

Asking an expert in your field that you have never met to review your manuscript

Gas leaking in base of new gas range?

Norwegian refuses EU delay (4.7 hours) compensation because it turned out there was nothing wrong with the aircraft

Repeat elements in list, but the number of times each element is repeated is provided by a separate list

How to create a grid following points in QGIS?

Social leper versus social leopard

Where Does VDD+0.3V Input Limit Come From on IC chips?

In a jam session, when asked which key my non-transposing instrument (like a violin) is in, what do I answer?

Hiking with a mule or two?

Pseudo Game of Cups in Python

What can a pilot do if an air traffic controller is incapacitated?

Can Northern Ireland's border issue be solved by repartition?

Nanomachines exist that enable Axolotl-levels of regeneration - So how can crippling injuries exist as well?

How to reference parameters outside of Apex Class that can be configured by Administrator

US entry with tourist visa but past alcohol arrest

How does one calculate the distribution of the Matt Colville way of rolling stats?

Minimize taxes now that I earn more

How do I extract code from an arduino?

Hilbert's hotel, why can't I repeat it infinitely many times?

Cheap antenna for new HF HAM

How could artificial intelligence harm us?



Python - The Collatz Sequence


Project Euler #14 (Longest Collatz sequence)Project Euler #14 — longest Collatz sequenceHailstone Sequences in PythonPython program for testing the Collatz ConjectureProject Euler: Longest Collatz SequenceCounting terms in Collatz sequences until 1 is reached or a limit is exceededAutomate the Boring Stuff - Collatz ExerciseComputational verification of Collatz conjecture






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








5












$begingroup$


Can I get a review of my code for the the Collatz Sequence from Chapter three of Automate the Boring Stuff with Python?




The Collatz Sequence



Write a function named collatz() that has one parameter named number.
If number is even, then collatz() should print number // 2 and return
this value. If number is odd, then collatz() should print and return 3
* number + 1.



Then write a program that lets the user type in an integer and that
keeps calling collatz() on that number until the function returns the
value 1. (Amazingly enough, this sequence actually works for any
integer—sooner or later, using this sequence, you’ll arrive at 1! Even
mathematicians aren’t sure why. Your program is exploring what’s
called the Collatz sequence, sometimes called “the simplest impossible
math problem.”)



Remember to convert the return value from input() to an integer with
the int() function; otherwise, it will be a string value.



Hint: An integer number is even if number % 2 == 0, and it’s odd if
number % 2 == 1.



The output of this program could look something like this:



Enter number:
3
10
5
16
8
4
2
1


Input Validation



Add try and except statements to the previous project to detect
whether the user types in a noninteger string. Normally, the int()
function will raise a ValueError error if it is passed a noninteger
string, as in int('puppy'). In the except clause, print a message to
the user saying they must enter an integer.




I am mainly wondering if there is a cleaner way to write my solution.



def collatz(num):
while num > 1:
if num % 2 == 0:
print(num//2)
num = num //2
elif num % 2 ==1:
print(3*num+1)
num = 3*num+1
else:
print(num)

def getNum():
global num
num = (input("> "))
try:
num = int(num)
except ValueError:
print('plese enter a number')
getNum()
getNum()
collatz(num)









share|improve this question









New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






$endgroup$









  • 2




    $begingroup$
    Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
    $endgroup$
    – Emad Boctor
    8 hours ago










  • $begingroup$
    @Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
    $endgroup$
    – cyberprogrammer
    8 hours ago

















5












$begingroup$


Can I get a review of my code for the the Collatz Sequence from Chapter three of Automate the Boring Stuff with Python?




The Collatz Sequence



Write a function named collatz() that has one parameter named number.
If number is even, then collatz() should print number // 2 and return
this value. If number is odd, then collatz() should print and return 3
* number + 1.



Then write a program that lets the user type in an integer and that
keeps calling collatz() on that number until the function returns the
value 1. (Amazingly enough, this sequence actually works for any
integer—sooner or later, using this sequence, you’ll arrive at 1! Even
mathematicians aren’t sure why. Your program is exploring what’s
called the Collatz sequence, sometimes called “the simplest impossible
math problem.”)



Remember to convert the return value from input() to an integer with
the int() function; otherwise, it will be a string value.



Hint: An integer number is even if number % 2 == 0, and it’s odd if
number % 2 == 1.



The output of this program could look something like this:



Enter number:
3
10
5
16
8
4
2
1


Input Validation



Add try and except statements to the previous project to detect
whether the user types in a noninteger string. Normally, the int()
function will raise a ValueError error if it is passed a noninteger
string, as in int('puppy'). In the except clause, print a message to
the user saying they must enter an integer.




I am mainly wondering if there is a cleaner way to write my solution.



def collatz(num):
while num > 1:
if num % 2 == 0:
print(num//2)
num = num //2
elif num % 2 ==1:
print(3*num+1)
num = 3*num+1
else:
print(num)

def getNum():
global num
num = (input("> "))
try:
num = int(num)
except ValueError:
print('plese enter a number')
getNum()
getNum()
collatz(num)









share|improve this question









New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






$endgroup$









  • 2




    $begingroup$
    Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
    $endgroup$
    – Emad Boctor
    8 hours ago










  • $begingroup$
    @Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
    $endgroup$
    – cyberprogrammer
    8 hours ago













5












5








5





$begingroup$


Can I get a review of my code for the the Collatz Sequence from Chapter three of Automate the Boring Stuff with Python?




The Collatz Sequence



Write a function named collatz() that has one parameter named number.
If number is even, then collatz() should print number // 2 and return
this value. If number is odd, then collatz() should print and return 3
* number + 1.



Then write a program that lets the user type in an integer and that
keeps calling collatz() on that number until the function returns the
value 1. (Amazingly enough, this sequence actually works for any
integer—sooner or later, using this sequence, you’ll arrive at 1! Even
mathematicians aren’t sure why. Your program is exploring what’s
called the Collatz sequence, sometimes called “the simplest impossible
math problem.”)



Remember to convert the return value from input() to an integer with
the int() function; otherwise, it will be a string value.



Hint: An integer number is even if number % 2 == 0, and it’s odd if
number % 2 == 1.



The output of this program could look something like this:



Enter number:
3
10
5
16
8
4
2
1


Input Validation



Add try and except statements to the previous project to detect
whether the user types in a noninteger string. Normally, the int()
function will raise a ValueError error if it is passed a noninteger
string, as in int('puppy'). In the except clause, print a message to
the user saying they must enter an integer.




I am mainly wondering if there is a cleaner way to write my solution.



def collatz(num):
while num > 1:
if num % 2 == 0:
print(num//2)
num = num //2
elif num % 2 ==1:
print(3*num+1)
num = 3*num+1
else:
print(num)

def getNum():
global num
num = (input("> "))
try:
num = int(num)
except ValueError:
print('plese enter a number')
getNum()
getNum()
collatz(num)









share|improve this question









New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






$endgroup$




Can I get a review of my code for the the Collatz Sequence from Chapter three of Automate the Boring Stuff with Python?




The Collatz Sequence



Write a function named collatz() that has one parameter named number.
If number is even, then collatz() should print number // 2 and return
this value. If number is odd, then collatz() should print and return 3
* number + 1.



Then write a program that lets the user type in an integer and that
keeps calling collatz() on that number until the function returns the
value 1. (Amazingly enough, this sequence actually works for any
integer—sooner or later, using this sequence, you’ll arrive at 1! Even
mathematicians aren’t sure why. Your program is exploring what’s
called the Collatz sequence, sometimes called “the simplest impossible
math problem.”)



Remember to convert the return value from input() to an integer with
the int() function; otherwise, it will be a string value.



Hint: An integer number is even if number % 2 == 0, and it’s odd if
number % 2 == 1.



The output of this program could look something like this:



Enter number:
3
10
5
16
8
4
2
1


Input Validation



Add try and except statements to the previous project to detect
whether the user types in a noninteger string. Normally, the int()
function will raise a ValueError error if it is passed a noninteger
string, as in int('puppy'). In the except clause, print a message to
the user saying they must enter an integer.




I am mainly wondering if there is a cleaner way to write my solution.



def collatz(num):
while num > 1:
if num % 2 == 0:
print(num//2)
num = num //2
elif num % 2 ==1:
print(3*num+1)
num = 3*num+1
else:
print(num)

def getNum():
global num
num = (input("> "))
try:
num = int(num)
except ValueError:
print('plese enter a number')
getNum()
getNum()
collatz(num)






python collatz-sequence






share|improve this question









New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.










share|improve this question









New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








share|improve this question




share|improve this question








edited 7 hours ago









200_success

136k21 gold badges175 silver badges445 bronze badges




136k21 gold badges175 silver badges445 bronze badges






New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








asked 8 hours ago









cyberprogrammercyberprogrammer

266 bronze badges




266 bronze badges




New contributor



cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




New contributor




cyberprogrammer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • 2




    $begingroup$
    Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
    $endgroup$
    – Emad Boctor
    8 hours ago










  • $begingroup$
    @Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
    $endgroup$
    – cyberprogrammer
    8 hours ago












  • 2




    $begingroup$
    Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
    $endgroup$
    – Emad Boctor
    8 hours ago










  • $begingroup$
    @Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
    $endgroup$
    – cyberprogrammer
    8 hours ago







2




2




$begingroup$
Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
$endgroup$
– Emad Boctor
8 hours ago




$begingroup$
Please add some description indicating what this chapter 3 thing is recommending with examples of input and output, nobody's going to guess what that is
$endgroup$
– Emad Boctor
8 hours ago












$begingroup$
@Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
$endgroup$
– cyberprogrammer
8 hours ago




$begingroup$
@Edmad Broctor and @ Carcigenicate Thanks for your feedback. I went ahead and revised my post.
$endgroup$
– cyberprogrammer
8 hours ago










2 Answers
2






active

oldest

votes


















6














$begingroup$

Prompt



The most obvious bad practice here is the use of a global variable. Instead of setting num as a side-effect, your function should return the result.



getNum() is not such a good name for the function. PEP 8, the official style guide for Python, says that function names should be lower_case_with_underscores. Furthermore, "get" implies that the function is retrieving a piece of data that is already stored somewhere, which is not the case here. Finally, "Num" should be more specific.



The use of recursion is not appropriate. If you want a loop, write a loop.



def ask_integer():
"""
Return an integer entered by the user (repeatedly prompting if
the input is not a valid integer).
"""
while True:
try:
return int(input("> "))
except ValueError:
print("Please enter an integer")

num = ask_integer()



collatz function



Strictly speaking, you didn't follow the instructions. Your solution isn't wrong or bad — you just didn't implement the collatz function according to the specification that was given, which says that you should print and return one single number.



def collatz(num):
"""
Given a number, print and return its successor in the Collatz sequence.
"""
next = num // 2 if num % 2 == 0 else 3 * num + 1
print(next)
return next

num = ask_integer()
while num > 1:
num = collatz(num)





share|improve this answer









$endgroup$














  • $begingroup$
    Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
    $endgroup$
    – RootTwo
    6 hours ago










  • $begingroup$
    @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
    $endgroup$
    – Carcigenicate
    4 hours ago


















4














$begingroup$

First, note how you're duplicating calculations:



print(num//2)
num = num //2


This may not cause issues with this specific code, but it isn't a good practice. You're doing twice as much work as you need to, which can cause performance issues once you start writing more complicated code. Do the calculation once, and save the result. In this case though, all you need to do is reverse those lines and use num:



num = num // 2
print(num)


Also, make sure you have proper spacing around operators, and be consistent.




Your if and elif cases are exclusive of each other, and your else should never happen. If the first condition is true, then other must be false and vice-versa. There's no need for the second check. Once rewritten, you'll see that printing in every case isn't necessary. You can just print after:



while num > 1:
if num % 2 == 0:
num = num // 2

else:
num = 3 * num + 1

print(num)


Since you're just reassinging num one of two options based on a condition, a conditional expression can be used here cleanly as well:



while num > 1:
num = (num // 2) if num % 2 == 0 else (3 * num + 1)
print(num)


The braces aren't necessary, but I think they're useful here due to the number of operators involved.





Printing the numbers isn't ideal here. In most code, you need to be able to use the data that you produce. If you wanted to analyze the produced sequence, you would have to do something intercept the stdout, which is expensive and overly complicated. Make it a function that accumulates and returns a list. In the following examples, I also added some type hints to make it clearer what the type of the data is:



from typing import List

def collatz(starting_num: int) -> List[int]:
nums = [starting_num]

num = starting_num
while num > 1:
num = (num // 2) if num % 2 == 0 else (3 * num + 1)
nums.append(num)

return nums


Or, a much cleaner approach is to make it a generator that yields the numbers:



# Calling this function returns a generator that produces ints
# Ignore the two Nones, as they aren't needed for this kind of generator
def collatz_gen(starting_num: int) -> Generator[int, None, None]:
yield starting_num

num = starting_num
while num > 1:
num = (num // 2) if num % 2 == 0 else (3 * num + 1)
yield num

>>> list(collatz_gen(5))
[5, 16, 8, 4, 2, 1]




There's a few notable things about getNum:



Python uses "snake_case", not "camelCase".




Your use of global num here is unnecessary and confusing. Just like before, explicitly return any data that the function produces:



def get_num() -> int:
raw_num = input("> ")

try:
return int(raw_num)

except ValueError:
print('Please enter a number')
return get_num()


Note how instead of reassigning a global num, we're just returning the number. I also spaced things out a bit, and used some more appropriate names. Conceptually, I'd say that num = input("> ") is wrong. At the time that that runs, num does not contain a number (it contains a string).




This isn't a good use of recursion. It likely won't cause you any problems, but if your user is really dumb and enters wrong data ~1000 times, your program will crash. Just use a loop:



def get_num() -> int:
while True:
raw_num = input("> ")

try:
return int(raw_num)

except ValueError:
print('Please enter a number')


In languages like Python, be careful using recursion in cases where you have no guarantees about how many times the function will recurse.




I'd also probably name this something closer to ask_for_num. "get" doesn't make it very clear about where the data is coming from.





Taken altogether, you'll end up with:



from typing import Generator

def collatz_gen(starting_num: int) -> Generator[int, None, None]:
yield starting_num

num = starting_num
while num > 1:
num = (num // 2) if num % 2 == 0 else (3 * num + 1)
yield num

def ask_for_num() -> int:
while True:
raw_num = input("> ")

try:
return int(raw_num)

except ValueError:
print('Please enter a number')


Which can be used like:



num = ask_for_num()

for n in collatz_gen(num):
print(n)





share|improve this answer











$endgroup$

















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "196"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );







    cyberprogrammer is a new contributor. Be nice, and check out our Code of Conduct.









    draft saved

    draft discarded
















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f229270%2fpython-the-collatz-sequence%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    6














    $begingroup$

    Prompt



    The most obvious bad practice here is the use of a global variable. Instead of setting num as a side-effect, your function should return the result.



    getNum() is not such a good name for the function. PEP 8, the official style guide for Python, says that function names should be lower_case_with_underscores. Furthermore, "get" implies that the function is retrieving a piece of data that is already stored somewhere, which is not the case here. Finally, "Num" should be more specific.



    The use of recursion is not appropriate. If you want a loop, write a loop.



    def ask_integer():
    """
    Return an integer entered by the user (repeatedly prompting if
    the input is not a valid integer).
    """
    while True:
    try:
    return int(input("> "))
    except ValueError:
    print("Please enter an integer")

    num = ask_integer()



    collatz function



    Strictly speaking, you didn't follow the instructions. Your solution isn't wrong or bad — you just didn't implement the collatz function according to the specification that was given, which says that you should print and return one single number.



    def collatz(num):
    """
    Given a number, print and return its successor in the Collatz sequence.
    """
    next = num // 2 if num % 2 == 0 else 3 * num + 1
    print(next)
    return next

    num = ask_integer()
    while num > 1:
    num = collatz(num)





    share|improve this answer









    $endgroup$














    • $begingroup$
      Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
      $endgroup$
      – RootTwo
      6 hours ago










    • $begingroup$
      @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
      $endgroup$
      – Carcigenicate
      4 hours ago















    6














    $begingroup$

    Prompt



    The most obvious bad practice here is the use of a global variable. Instead of setting num as a side-effect, your function should return the result.



    getNum() is not such a good name for the function. PEP 8, the official style guide for Python, says that function names should be lower_case_with_underscores. Furthermore, "get" implies that the function is retrieving a piece of data that is already stored somewhere, which is not the case here. Finally, "Num" should be more specific.



    The use of recursion is not appropriate. If you want a loop, write a loop.



    def ask_integer():
    """
    Return an integer entered by the user (repeatedly prompting if
    the input is not a valid integer).
    """
    while True:
    try:
    return int(input("> "))
    except ValueError:
    print("Please enter an integer")

    num = ask_integer()



    collatz function



    Strictly speaking, you didn't follow the instructions. Your solution isn't wrong or bad — you just didn't implement the collatz function according to the specification that was given, which says that you should print and return one single number.



    def collatz(num):
    """
    Given a number, print and return its successor in the Collatz sequence.
    """
    next = num // 2 if num % 2 == 0 else 3 * num + 1
    print(next)
    return next

    num = ask_integer()
    while num > 1:
    num = collatz(num)





    share|improve this answer









    $endgroup$














    • $begingroup$
      Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
      $endgroup$
      – RootTwo
      6 hours ago










    • $begingroup$
      @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
      $endgroup$
      – Carcigenicate
      4 hours ago













    6














    6










    6







    $begingroup$

    Prompt



    The most obvious bad practice here is the use of a global variable. Instead of setting num as a side-effect, your function should return the result.



    getNum() is not such a good name for the function. PEP 8, the official style guide for Python, says that function names should be lower_case_with_underscores. Furthermore, "get" implies that the function is retrieving a piece of data that is already stored somewhere, which is not the case here. Finally, "Num" should be more specific.



    The use of recursion is not appropriate. If you want a loop, write a loop.



    def ask_integer():
    """
    Return an integer entered by the user (repeatedly prompting if
    the input is not a valid integer).
    """
    while True:
    try:
    return int(input("> "))
    except ValueError:
    print("Please enter an integer")

    num = ask_integer()



    collatz function



    Strictly speaking, you didn't follow the instructions. Your solution isn't wrong or bad — you just didn't implement the collatz function according to the specification that was given, which says that you should print and return one single number.



    def collatz(num):
    """
    Given a number, print and return its successor in the Collatz sequence.
    """
    next = num // 2 if num % 2 == 0 else 3 * num + 1
    print(next)
    return next

    num = ask_integer()
    while num > 1:
    num = collatz(num)





    share|improve this answer









    $endgroup$



    Prompt



    The most obvious bad practice here is the use of a global variable. Instead of setting num as a side-effect, your function should return the result.



    getNum() is not such a good name for the function. PEP 8, the official style guide for Python, says that function names should be lower_case_with_underscores. Furthermore, "get" implies that the function is retrieving a piece of data that is already stored somewhere, which is not the case here. Finally, "Num" should be more specific.



    The use of recursion is not appropriate. If you want a loop, write a loop.



    def ask_integer():
    """
    Return an integer entered by the user (repeatedly prompting if
    the input is not a valid integer).
    """
    while True:
    try:
    return int(input("> "))
    except ValueError:
    print("Please enter an integer")

    num = ask_integer()



    collatz function



    Strictly speaking, you didn't follow the instructions. Your solution isn't wrong or bad — you just didn't implement the collatz function according to the specification that was given, which says that you should print and return one single number.



    def collatz(num):
    """
    Given a number, print and return its successor in the Collatz sequence.
    """
    next = num // 2 if num % 2 == 0 else 3 * num + 1
    print(next)
    return next

    num = ask_integer()
    while num > 1:
    num = collatz(num)






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered 7 hours ago









    200_success200_success

    136k21 gold badges175 silver badges445 bronze badges




    136k21 gold badges175 silver badges445 bronze badges














    • $begingroup$
      Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
      $endgroup$
      – RootTwo
      6 hours ago










    • $begingroup$
      @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
      $endgroup$
      – Carcigenicate
      4 hours ago
















    • $begingroup$
      Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
      $endgroup$
      – RootTwo
      6 hours ago










    • $begingroup$
      @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
      $endgroup$
      – Carcigenicate
      4 hours ago















    $begingroup$
    Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
    $endgroup$
    – RootTwo
    6 hours ago




    $begingroup$
    Perhaps reverse the test and eliminate the comparison to 0: next = 3 * num + 1 if num % 2 else num // 2
    $endgroup$
    – RootTwo
    6 hours ago












    $begingroup$
    @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
    $endgroup$
    – Carcigenicate
    4 hours ago




    $begingroup$
    @RootTwo Honestly, I find that that muddies the intent. We're not checking if num % 2 is falsey; it's not a predicate. We're checking if it's equal to 0. It just so happens that they're equivalent in Python.
    $endgroup$
    – Carcigenicate
    4 hours ago













    4














    $begingroup$

    First, note how you're duplicating calculations:



    print(num//2)
    num = num //2


    This may not cause issues with this specific code, but it isn't a good practice. You're doing twice as much work as you need to, which can cause performance issues once you start writing more complicated code. Do the calculation once, and save the result. In this case though, all you need to do is reverse those lines and use num:



    num = num // 2
    print(num)


    Also, make sure you have proper spacing around operators, and be consistent.




    Your if and elif cases are exclusive of each other, and your else should never happen. If the first condition is true, then other must be false and vice-versa. There's no need for the second check. Once rewritten, you'll see that printing in every case isn't necessary. You can just print after:



    while num > 1:
    if num % 2 == 0:
    num = num // 2

    else:
    num = 3 * num + 1

    print(num)


    Since you're just reassinging num one of two options based on a condition, a conditional expression can be used here cleanly as well:



    while num > 1:
    num = (num // 2) if num % 2 == 0 else (3 * num + 1)
    print(num)


    The braces aren't necessary, but I think they're useful here due to the number of operators involved.





    Printing the numbers isn't ideal here. In most code, you need to be able to use the data that you produce. If you wanted to analyze the produced sequence, you would have to do something intercept the stdout, which is expensive and overly complicated. Make it a function that accumulates and returns a list. In the following examples, I also added some type hints to make it clearer what the type of the data is:



    from typing import List

    def collatz(starting_num: int) -> List[int]:
    nums = [starting_num]

    num = starting_num
    while num > 1:
    num = (num // 2) if num % 2 == 0 else (3 * num + 1)
    nums.append(num)

    return nums


    Or, a much cleaner approach is to make it a generator that yields the numbers:



    # Calling this function returns a generator that produces ints
    # Ignore the two Nones, as they aren't needed for this kind of generator
    def collatz_gen(starting_num: int) -> Generator[int, None, None]:
    yield starting_num

    num = starting_num
    while num > 1:
    num = (num // 2) if num % 2 == 0 else (3 * num + 1)
    yield num

    >>> list(collatz_gen(5))
    [5, 16, 8, 4, 2, 1]




    There's a few notable things about getNum:



    Python uses "snake_case", not "camelCase".




    Your use of global num here is unnecessary and confusing. Just like before, explicitly return any data that the function produces:



    def get_num() -> int:
    raw_num = input("> ")

    try:
    return int(raw_num)

    except ValueError:
    print('Please enter a number')
    return get_num()


    Note how instead of reassigning a global num, we're just returning the number. I also spaced things out a bit, and used some more appropriate names. Conceptually, I'd say that num = input("> ") is wrong. At the time that that runs, num does not contain a number (it contains a string).




    This isn't a good use of recursion. It likely won't cause you any problems, but if your user is really dumb and enters wrong data ~1000 times, your program will crash. Just use a loop:



    def get_num() -> int:
    while True:
    raw_num = input("> ")

    try:
    return int(raw_num)

    except ValueError:
    print('Please enter a number')


    In languages like Python, be careful using recursion in cases where you have no guarantees about how many times the function will recurse.




    I'd also probably name this something closer to ask_for_num. "get" doesn't make it very clear about where the data is coming from.





    Taken altogether, you'll end up with:



    from typing import Generator

    def collatz_gen(starting_num: int) -> Generator[int, None, None]:
    yield starting_num

    num = starting_num
    while num > 1:
    num = (num // 2) if num % 2 == 0 else (3 * num + 1)
    yield num

    def ask_for_num() -> int:
    while True:
    raw_num = input("> ")

    try:
    return int(raw_num)

    except ValueError:
    print('Please enter a number')


    Which can be used like:



    num = ask_for_num()

    for n in collatz_gen(num):
    print(n)





    share|improve this answer











    $endgroup$



















      4














      $begingroup$

      First, note how you're duplicating calculations:



      print(num//2)
      num = num //2


      This may not cause issues with this specific code, but it isn't a good practice. You're doing twice as much work as you need to, which can cause performance issues once you start writing more complicated code. Do the calculation once, and save the result. In this case though, all you need to do is reverse those lines and use num:



      num = num // 2
      print(num)


      Also, make sure you have proper spacing around operators, and be consistent.




      Your if and elif cases are exclusive of each other, and your else should never happen. If the first condition is true, then other must be false and vice-versa. There's no need for the second check. Once rewritten, you'll see that printing in every case isn't necessary. You can just print after:



      while num > 1:
      if num % 2 == 0:
      num = num // 2

      else:
      num = 3 * num + 1

      print(num)


      Since you're just reassinging num one of two options based on a condition, a conditional expression can be used here cleanly as well:



      while num > 1:
      num = (num // 2) if num % 2 == 0 else (3 * num + 1)
      print(num)


      The braces aren't necessary, but I think they're useful here due to the number of operators involved.





      Printing the numbers isn't ideal here. In most code, you need to be able to use the data that you produce. If you wanted to analyze the produced sequence, you would have to do something intercept the stdout, which is expensive and overly complicated. Make it a function that accumulates and returns a list. In the following examples, I also added some type hints to make it clearer what the type of the data is:



      from typing import List

      def collatz(starting_num: int) -> List[int]:
      nums = [starting_num]

      num = starting_num
      while num > 1:
      num = (num // 2) if num % 2 == 0 else (3 * num + 1)
      nums.append(num)

      return nums


      Or, a much cleaner approach is to make it a generator that yields the numbers:



      # Calling this function returns a generator that produces ints
      # Ignore the two Nones, as they aren't needed for this kind of generator
      def collatz_gen(starting_num: int) -> Generator[int, None, None]:
      yield starting_num

      num = starting_num
      while num > 1:
      num = (num // 2) if num % 2 == 0 else (3 * num + 1)
      yield num

      >>> list(collatz_gen(5))
      [5, 16, 8, 4, 2, 1]




      There's a few notable things about getNum:



      Python uses "snake_case", not "camelCase".




      Your use of global num here is unnecessary and confusing. Just like before, explicitly return any data that the function produces:



      def get_num() -> int:
      raw_num = input("> ")

      try:
      return int(raw_num)

      except ValueError:
      print('Please enter a number')
      return get_num()


      Note how instead of reassigning a global num, we're just returning the number. I also spaced things out a bit, and used some more appropriate names. Conceptually, I'd say that num = input("> ") is wrong. At the time that that runs, num does not contain a number (it contains a string).




      This isn't a good use of recursion. It likely won't cause you any problems, but if your user is really dumb and enters wrong data ~1000 times, your program will crash. Just use a loop:



      def get_num() -> int:
      while True:
      raw_num = input("> ")

      try:
      return int(raw_num)

      except ValueError:
      print('Please enter a number')


      In languages like Python, be careful using recursion in cases where you have no guarantees about how many times the function will recurse.




      I'd also probably name this something closer to ask_for_num. "get" doesn't make it very clear about where the data is coming from.





      Taken altogether, you'll end up with:



      from typing import Generator

      def collatz_gen(starting_num: int) -> Generator[int, None, None]:
      yield starting_num

      num = starting_num
      while num > 1:
      num = (num // 2) if num % 2 == 0 else (3 * num + 1)
      yield num

      def ask_for_num() -> int:
      while True:
      raw_num = input("> ")

      try:
      return int(raw_num)

      except ValueError:
      print('Please enter a number')


      Which can be used like:



      num = ask_for_num()

      for n in collatz_gen(num):
      print(n)





      share|improve this answer











      $endgroup$

















        4














        4










        4







        $begingroup$

        First, note how you're duplicating calculations:



        print(num//2)
        num = num //2


        This may not cause issues with this specific code, but it isn't a good practice. You're doing twice as much work as you need to, which can cause performance issues once you start writing more complicated code. Do the calculation once, and save the result. In this case though, all you need to do is reverse those lines and use num:



        num = num // 2
        print(num)


        Also, make sure you have proper spacing around operators, and be consistent.




        Your if and elif cases are exclusive of each other, and your else should never happen. If the first condition is true, then other must be false and vice-versa. There's no need for the second check. Once rewritten, you'll see that printing in every case isn't necessary. You can just print after:



        while num > 1:
        if num % 2 == 0:
        num = num // 2

        else:
        num = 3 * num + 1

        print(num)


        Since you're just reassinging num one of two options based on a condition, a conditional expression can be used here cleanly as well:



        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        print(num)


        The braces aren't necessary, but I think they're useful here due to the number of operators involved.





        Printing the numbers isn't ideal here. In most code, you need to be able to use the data that you produce. If you wanted to analyze the produced sequence, you would have to do something intercept the stdout, which is expensive and overly complicated. Make it a function that accumulates and returns a list. In the following examples, I also added some type hints to make it clearer what the type of the data is:



        from typing import List

        def collatz(starting_num: int) -> List[int]:
        nums = [starting_num]

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        nums.append(num)

        return nums


        Or, a much cleaner approach is to make it a generator that yields the numbers:



        # Calling this function returns a generator that produces ints
        # Ignore the two Nones, as they aren't needed for this kind of generator
        def collatz_gen(starting_num: int) -> Generator[int, None, None]:
        yield starting_num

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        yield num

        >>> list(collatz_gen(5))
        [5, 16, 8, 4, 2, 1]




        There's a few notable things about getNum:



        Python uses "snake_case", not "camelCase".




        Your use of global num here is unnecessary and confusing. Just like before, explicitly return any data that the function produces:



        def get_num() -> int:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')
        return get_num()


        Note how instead of reassigning a global num, we're just returning the number. I also spaced things out a bit, and used some more appropriate names. Conceptually, I'd say that num = input("> ") is wrong. At the time that that runs, num does not contain a number (it contains a string).




        This isn't a good use of recursion. It likely won't cause you any problems, but if your user is really dumb and enters wrong data ~1000 times, your program will crash. Just use a loop:



        def get_num() -> int:
        while True:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')


        In languages like Python, be careful using recursion in cases where you have no guarantees about how many times the function will recurse.




        I'd also probably name this something closer to ask_for_num. "get" doesn't make it very clear about where the data is coming from.





        Taken altogether, you'll end up with:



        from typing import Generator

        def collatz_gen(starting_num: int) -> Generator[int, None, None]:
        yield starting_num

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        yield num

        def ask_for_num() -> int:
        while True:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')


        Which can be used like:



        num = ask_for_num()

        for n in collatz_gen(num):
        print(n)





        share|improve this answer











        $endgroup$



        First, note how you're duplicating calculations:



        print(num//2)
        num = num //2


        This may not cause issues with this specific code, but it isn't a good practice. You're doing twice as much work as you need to, which can cause performance issues once you start writing more complicated code. Do the calculation once, and save the result. In this case though, all you need to do is reverse those lines and use num:



        num = num // 2
        print(num)


        Also, make sure you have proper spacing around operators, and be consistent.




        Your if and elif cases are exclusive of each other, and your else should never happen. If the first condition is true, then other must be false and vice-versa. There's no need for the second check. Once rewritten, you'll see that printing in every case isn't necessary. You can just print after:



        while num > 1:
        if num % 2 == 0:
        num = num // 2

        else:
        num = 3 * num + 1

        print(num)


        Since you're just reassinging num one of two options based on a condition, a conditional expression can be used here cleanly as well:



        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        print(num)


        The braces aren't necessary, but I think they're useful here due to the number of operators involved.





        Printing the numbers isn't ideal here. In most code, you need to be able to use the data that you produce. If you wanted to analyze the produced sequence, you would have to do something intercept the stdout, which is expensive and overly complicated. Make it a function that accumulates and returns a list. In the following examples, I also added some type hints to make it clearer what the type of the data is:



        from typing import List

        def collatz(starting_num: int) -> List[int]:
        nums = [starting_num]

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        nums.append(num)

        return nums


        Or, a much cleaner approach is to make it a generator that yields the numbers:



        # Calling this function returns a generator that produces ints
        # Ignore the two Nones, as they aren't needed for this kind of generator
        def collatz_gen(starting_num: int) -> Generator[int, None, None]:
        yield starting_num

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        yield num

        >>> list(collatz_gen(5))
        [5, 16, 8, 4, 2, 1]




        There's a few notable things about getNum:



        Python uses "snake_case", not "camelCase".




        Your use of global num here is unnecessary and confusing. Just like before, explicitly return any data that the function produces:



        def get_num() -> int:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')
        return get_num()


        Note how instead of reassigning a global num, we're just returning the number. I also spaced things out a bit, and used some more appropriate names. Conceptually, I'd say that num = input("> ") is wrong. At the time that that runs, num does not contain a number (it contains a string).




        This isn't a good use of recursion. It likely won't cause you any problems, but if your user is really dumb and enters wrong data ~1000 times, your program will crash. Just use a loop:



        def get_num() -> int:
        while True:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')


        In languages like Python, be careful using recursion in cases where you have no guarantees about how many times the function will recurse.




        I'd also probably name this something closer to ask_for_num. "get" doesn't make it very clear about where the data is coming from.





        Taken altogether, you'll end up with:



        from typing import Generator

        def collatz_gen(starting_num: int) -> Generator[int, None, None]:
        yield starting_num

        num = starting_num
        while num > 1:
        num = (num // 2) if num % 2 == 0 else (3 * num + 1)
        yield num

        def ask_for_num() -> int:
        while True:
        raw_num = input("> ")

        try:
        return int(raw_num)

        except ValueError:
        print('Please enter a number')


        Which can be used like:



        num = ask_for_num()

        for n in collatz_gen(num):
        print(n)






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 7 hours ago

























        answered 8 hours ago









        CarcigenicateCarcigenicate

        7,2341 gold badge19 silver badges46 bronze badges




        7,2341 gold badge19 silver badges46 bronze badges
























            cyberprogrammer is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded

















            cyberprogrammer is a new contributor. Be nice, and check out our Code of Conduct.












            cyberprogrammer is a new contributor. Be nice, and check out our Code of Conduct.











            cyberprogrammer is a new contributor. Be nice, and check out our Code of Conduct.














            Thanks for contributing an answer to Code Review Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f229270%2fpython-the-collatz-sequence%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу

            Israel Cuprins Etimologie | Istorie | Geografie | Politică | Demografie | Educație | Economie | Cultură | Note explicative | Note bibliografice | Bibliografie | Legături externe | Meniu de navigaresite web oficialfacebooktweeterGoogle+Instagramcanal YouTubeInstagramtextmodificaremodificarewww.technion.ac.ilnew.huji.ac.ilwww.weizmann.ac.ilwww1.biu.ac.ilenglish.tau.ac.ilwww.haifa.ac.ilin.bgu.ac.ilwww.openu.ac.ilwww.ariel.ac.ilCIA FactbookHarta Israelului"Negotiating Jerusalem," Palestine–Israel JournalThe Schizoid Nature of Modern Hebrew: A Slavic Language in Search of a Semitic Past„Arabic in Israel: an official language and a cultural bridge”„Latest Population Statistics for Israel”„Israel Population”„Tables”„Report for Selected Countries and Subjects”Human Development Report 2016: Human Development for Everyone„Distribution of family income - Gini index”The World FactbookJerusalem Law„Israel”„Israel”„Zionist Leaders: David Ben-Gurion 1886–1973”„The status of Jerusalem”„Analysis: Kadima's big plans”„Israel's Hard-Learned Lessons”„The Legacy of Undefined Borders, Tel Aviv Notes No. 40, 5 iunie 2002”„Israel Journal: A Land Without Borders”„Population”„Israel closes decade with population of 7.5 million”Time Series-DataBank„Selected Statistics on Jerusalem Day 2007 (Hebrew)”Golan belongs to Syria, Druze protestGlobal Survey 2006: Middle East Progress Amid Global Gains in FreedomWHO: Life expectancy in Israel among highest in the worldInternational Monetary Fund, World Economic Outlook Database, April 2011: Nominal GDP list of countries. Data for the year 2010.„Israel's accession to the OECD”Popular Opinion„On the Move”Hosea 12:5„Walking the Bible Timeline”„Palestine: History”„Return to Zion”An invention called 'the Jewish people' – Haaretz – Israel NewsoriginalJewish and Non-Jewish Population of Palestine-Israel (1517–2004)ImmigrationJewishvirtuallibrary.orgChapter One: The Heralders of Zionism„The birth of modern Israel: A scrap of paper that changed history”„League of Nations: The Mandate for Palestine, 24 iulie 1922”The Population of Palestine Prior to 1948originalBackground Paper No. 47 (ST/DPI/SER.A/47)History: Foreign DominationTwo Hundred and Seventh Plenary Meeting„Israel (Labor Zionism)”Population, by Religion and Population GroupThe Suez CrisisAdolf EichmannJustice Ministry Reply to Amnesty International Report„The Interregnum”Israel Ministry of Foreign Affairs – The Palestinian National Covenant- July 1968Research on terrorism: trends, achievements & failuresThe Routledge Atlas of the Arab–Israeli conflict: The Complete History of the Struggle and the Efforts to Resolve It"George Habash, Palestinian Terrorism Tactician, Dies at 82."„1973: Arab states attack Israeli forces”Agranat Commission„Has Israel Annexed East Jerusalem?”original„After 4 Years, Intifada Still Smolders”From the End of the Cold War to 2001originalThe Oslo Accords, 1993Israel-PLO Recognition – Exchange of Letters between PM Rabin and Chairman Arafat – Sept 9- 1993Foundation for Middle East PeaceSources of Population Growth: Total Israeli Population and Settler Population, 1991–2003original„Israel marks Rabin assassination”The Wye River Memorandumoriginal„West Bank barrier route disputed, Israeli missile kills 2”"Permanent Ceasefire to Be Based on Creation Of Buffer Zone Free of Armed Personnel Other than UN, Lebanese Forces"„Hezbollah kills 8 soldiers, kidnaps two in offensive on northern border”„Olmert confirms peace talks with Syria”„Battleground Gaza: Israeli ground forces invade the strip”„IDF begins Gaza troop withdrawal, hours after ending 3-week offensive”„THE LAND: Geography and Climate”„Area of districts, sub-districts, natural regions and lakes”„Israel - Geography”„Makhteshim Country”Israel and the Palestinian Territories„Makhtesh Ramon”„The Living Dead Sea”„Temperatures reach record high in Pakistan”„Climate Extremes In Israel”Israel in figures„Deuteronom”„JNF: 240 million trees planted since 1901”„Vegetation of Israel and Neighboring Countries”Environmental Law in Israel„Executive branch”„Israel's election process explained”„The Electoral System in Israel”„Constitution for Israel”„All 120 incoming Knesset members”„Statul ISRAEL”„The Judiciary: The Court System”„Israel's high court unique in region”„Israel and the International Criminal Court: A Legal Battlefield”„Localities and population, by population group, district, sub-district and natural region”„Israel: Districts, Major Cities, Urban Localities & Metropolitan Areas”„Israel-Egypt Relations: Background & Overview of Peace Treaty”„Solana to Haaretz: New Rules of War Needed for Age of Terror”„Israel's Announcement Regarding Settlements”„United Nations Security Council Resolution 497”„Security Council resolution 478 (1980) on the status of Jerusalem”„Arabs will ask U.N. to seek razing of Israeli wall”„Olmert: Willing to trade land for peace”„Mapping Peace between Syria and Israel”„Egypt: Israel must accept the land-for-peace formula”„Israel: Age structure from 2005 to 2015”„Global, regional, and national disability-adjusted life years (DALYs) for 306 diseases and injuries and healthy life expectancy (HALE) for 188 countries, 1990–2013: quantifying the epidemiological transition”10.1016/S0140-6736(15)61340-X„World Health Statistics 2014”„Life expectancy for Israeli men world's 4th highest”„Family Structure and Well-Being Across Israel's Diverse Population”„Fertility among Jewish and Muslim Women in Israel, by Level of Religiosity, 1979-2009”„Israel leaders in birth rate, but poverty major challenge”„Ethnic Groups”„Israel's population: Over 8.5 million”„Israel - Ethnic groups”„Jews, by country of origin and age”„Minority Communities in Israel: Background & Overview”„Israel”„Language in Israel”„Selected Data from the 2011 Social Survey on Mastery of the Hebrew Language and Usage of Languages”„Religions”„5 facts about Israeli Druze, a unique religious and ethnic group”„Israël”Israel Country Study Guide„Haredi city in Negev – blessing or curse?”„New town Harish harbors hopes of being more than another Pleasantville”„List of localities, in alphabetical order”„Muncitorii români, doriți în Israel”„Prietenia româno-israeliană la nevoie se cunoaște”„The Higher Education System in Israel”„Middle East”„Academic Ranking of World Universities 2016”„Israel”„Israel”„Jewish Nobel Prize Winners”„All Nobel Prizes in Literature”„All Nobel Peace Prizes”„All Prizes in Economic Sciences”„All Nobel Prizes in Chemistry”„List of Fields Medallists”„Sakharov Prize”„Țara care și-a sfidat "destinul" și se bate umăr la umăr cu Silicon Valley”„Apple's R&D center in Israel grew to about 800 employees”„Tim Cook: Apple's Herzliya R&D center second-largest in world”„Lecții de economie de la Israel”„Land use”Israel Investment and Business GuideA Country Study: IsraelCentral Bureau of StatisticsFlorin Diaconu, „Kadima: Flexibilitate și pragmatism, dar nici un compromis în chestiuni vitale", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 71-72Florin Diaconu, „Likud: Dreapta israeliană constant opusă retrocedării teritoriilor cureite prin luptă în 1967", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 73-74MassadaIsraelul a crescut in 50 de ani cât alte state intr-un mileniuIsrael Government PortalIsraelIsraelIsraelmmmmmXX451232cb118646298(data)4027808-634110000 0004 0372 0767n7900328503691455-bb46-37e3-91d2-cb064a35ffcc1003570400564274ge1294033523775214929302638955X146498911146498911

            Черчино Становништво Референце Спољашње везе Мени за навигацију46°09′29″ СГШ; 9°30′29″ ИГД / 46.15809° СГШ; 9.50814° ИГД / 46.15809; 9.5081446°09′29″ СГШ; 9°30′29″ ИГД / 46.15809° СГШ; 9.50814° ИГД / 46.15809; 9.508143179111„The GeoNames geographical database”„Istituto Nazionale di Statistica”Званични веб-сајтпроширитиуу