2011-11-29 27 views
6

Tôi phải thừa nhận, tôi không phải là chuyên gia toán học, đó là lý do tại sao tôi không thể giải quyết vấn đề sau đây cho sự hài lòng của tôi.vòng đếm đến 100 và quay lại 0 và lên đến 100 lần nữa và như vậy trên

Tôi có một số, giả sử i = 0. Tôi có một chức năng làm tăng i trên mỗi cuộc gọi bằng 1 và sau đó tự gọi lại, tăng thêm một lần nữa và lần khác và khác ... Khi đạt đến 100 tôi muốn nó đếm ngược về 0 và sau đó lại một lần nữa, giống như một endles vòng lặp với tôi đi lên và xuống như một thang máy. Whats một giải pháp thanh lịch cho điều đó?

Giải pháp của tôi cho đến nay:

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() 

Tôi đang tìm kiếm một cái gì đó ngắn hơn.

+0

nên có (Tôi hy vọng) có một số chậm trễ giữa đếm? Nếu không môi trường của bạn sẽ chỉ bị khóa. – RightSaidFred

+0

có, không thử mã này, chỉ để hiển thị ý tưởng của nó. – Hans

Trả lời

6

Trông ok với tôi, nhưng có lẽ sẽ bán con chó của bạn vào chế độ nô lệ và ăn cắp bia của bạn:

var direction = 1; 
var i = 0; 

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

trông có vẻ chặt chẽ, i% ​​100 làm gì? – Hans

+1

Chia 100 và trả lại phần còn lại – Arjan

+0

chạy mã này mang lại " Uncaught SyntaxError: Mã thông báo không mong muốn) "một khung đến nhiều ... hướng * = ((i% 100 == 0)? -1: 1) – Hans

3

Bạn có thể có biến số sẽ thêm hoặc giảm số tiền nếu số đó dương hoặc âm. Vì vậy, bạn sẽ chỉ phải thay đổi dấu hiệu biến.

var countingUp = 1; 
var i = 0; 

function count() { 

    i += (1 * countingUp); 

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

fiddle here.

Để tránh đệ quy vô hạn, chỉ cần sử dụng một setInterval().

window.setInterval(count, 1); 
+0

Vô hạn đệ quy trong đó ... đếm cuộc gọi đếm số cuộc gọi ... –

+0

Đệ quy đệ quy ... Trong khi vòng lặp ... điều tương tự đối với tôi (OK, không phải điều tương tự vì JS runtimes không hỗ trợ đệ quy đuôi :() – hugomg

+0

@missingno chỉ cần sử dụng setInterval và tránh gọi cùng chức năng bên trong cùng chức năng ... kiểm tra fiddle đã chỉnh sửa của tôi. –

1

Just for fun:

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

và sau đó sử dụng nó

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

Biểu thức abs((i % 200) - 100) làm cho mô hình răng cưa mà bạn muốn khi tôi tăng lên.

Vì vậy, sau đó một cái gì đó như thế này:

var i = 100; 
while (1) { 
    var j = Math.abs((i % 200) - 100); 
    // Use j 
    // ... 
    i += 1; 
} 
Các vấn đề liên quan