2011-11-29 14 views
6

पर मुझे स्वीकार करना होगा कि मैं गणितीय विशेषज्ञ नहीं हूं, इसलिए मैं अपनी संतुष्टि के लिए निम्नलिखित समस्या का समाधान क्यों नहीं कर सकता।लूप 100 और 0 से ऊपर और 100 तक फिर से गिनती है और

मेरे पास एक संख्या है, मैं = 0 कहता हूं। मेरे पास एक ऐसा फ़ंक्शन है जो प्रत्येक कॉल पर 1 से बढ़ाता है और फिर खुद को कॉल करता है, मुझे एक और समय और दूसरा और दूसरा बढ़ता है ... 100 तक पहुंचने पर मैं चाहता हूं कि यह 0 से आगे की गिनती करे और फिर फिर से एक तरह की तरह मैं एक लिफ्ट की तरह ऊपर और नीचे जा रहा हूँ। इसके लिए एक सुंदर समाधान क्या है?

मेरे समाधान अब तक:

var countingUp = true; 
var i = 0; 

function count() { 
if(i < 100 && countingUp) {i+=1} 
if(i > 1 && !countingUp) {i-=1} 

if(i===100) {countingUp=false;} 
if(i===1) {countingUp=true;} 

count() 
} 
count() 

मैं कम कुछ के लिए देख रहा हूँ।

+0

चाहिए वहाँ (मुझे आशा है) की गिनती करने में विलंब हो सकता है? अन्यथा आपका पर्यावरण बस लॉक हो जाएगा। – RightSaidFred

+0

हां, इस कोड को न करें, केवल विचार दिखाने के लिए। – Hans

उत्तर

6

मेरे लिए ठीक लग रहा है, लेकिन शायद गुलामी के लिए अपने कुत्ते को बेचते हैं और अपने बियर चोरी:

var direction = 1; 
var i = 0; 

function count() { 
    i += direction; 
    direction *= (((i % 100) == 0) ? -1 : 1); 
} 
+0

कसकर दिखता है, मैं% 100 क्या करता हूं? – Hans

+1

100 से विभाजित करें और शेष को वापस करें। – Arjan

+0

इस कोड को चलाने से उत्पन्न होता है " Uncaught SyntaxError: अप्रत्याशित टोकन) "एक ब्रैकेट बहुत ... दिशा * = ((i% 100 == 0)? -1: 1) – Hans

3

आपके पास एक चर हो सकता है जो राशि को सकारात्मक या नकारात्मक होने पर राशि को जोड़ या घटाएगा। तो आपको केवल वैरिएबल साइन बदलना होगा।

var countingUp = 1; 
var i = 0; 

function count() { 

    i += (1 * countingUp); 

    if (i == 100 || i == 0) 
    { 
     countingUp *= -1; 
    } 
} 

fiddle here.

अनंत प्रत्यावर्तन होने से बचने के लिए, बस एक setInterval का उपयोग()।

window.setInterval(count, 1); 
+0

वहां असीमित रिकर्सन ... गिनती कॉल गिनती कॉल गिनती ... –

+0

अनंत रिकर्सन ... जबकि लूप ... मेरे लिए एक ही चीज़ (ठीक है, वही बात नहीं है क्योंकि जेएस रनटाइम पूंछ रिकर्सन का समर्थन नहीं करते हैं :() – hugomg

+0

@missingno बस setInterval का उपयोग करें और उसी फ़ंक्शन के अंदर एक ही फ़ंक्शन को कॉल करने से बचें ... –

1
बस मस्ती के लिए

:

function createCounter(min,max) { 
    var dir = -1, val = min; 
    return function() { return val += ((val >= max || val <= min) ? dir=-dir : dir); } 
} 

और फिर इसे

उपयोग करने के लिए
var counter = createCounter(0,5); 
counter(); // 1 
counter(); // 2 
counter(); // 3 
counter(); // 4 
counter(); // 5 
counter(); // 4 
counter(); // 3 
counter(); // 2 
counter(); // 1 
counter(); // 0 
counter(); // 1 
counter(); // 2 
4

अभिव्यक्ति abs((i % 200) - 100) आपके द्वारा बढ़े जाने वाले आर्टूओथ पैटर्न को बनाता है।

तो फिर कुछ इस तरह:

var i = 100; 
while (1) { 
    var j = Math.abs((i % 200) - 100); 
    // Use j 
    // ... 
    i += 1; 
}