diff --git a/dask/base.py b/dask/base.py
index c05cdc7cc..c2cb0d050 100644
--- a/dask/base.py
+++ b/dask/base.py
@@ -697,7 +697,13 @@ def normalize_set(s):
 
 @normalize_token.register((tuple, list))
 def normalize_seq(seq):
-    return type(seq).__name__, list(map(normalize_token, seq))
+    def func(seq):
+        try:
+            return list(map(normalize_token, seq))
+        except RecursionError:
+            return str(uuid.uuid4())
+
+    return type(seq).__name__, func(seq)
 
 
 @normalize_token.register(literal)
@@ -1004,7 +1010,7 @@ def get_scheduler(get=None, scheduler=None, collections=None, cls=None):
     There are various ways to specify the scheduler to use:
 
     1.  Passing in scheduler= parameters
-    2.  Passing these into global confiuration
+    2.  Passing these into global configuration
     3.  Using defaults of a dask collection
 
     This function centralizes the logic to determine the right scheduler to use

dask.base.tokenize raises RecursionError when passed an object that contains cycles
**What happened**: `RecursionError` is raised when passing an object containing cycles to `dask.tokenize`

**What you expected to happen**: A valid token to be returned

**Minimal Complete Verifiable Example**:

```python
import dask.base

cycle = dict(a=None)
cycle["a"] = cycle

dask.base.tokenize(cycle)
```

**Anything else we need to know?**:

**Environment**:

- Dask version: 2.20.0
- Python version: 3.8
- Operating System: Ubuntu 18.04 LTS (running under WSL)
- Install method (conda, pip, source): conda (from conda forge)

diff --git a/dask/tests/test_base.py b/dask/tests/test_base.py
index 65a22030a..0cda5e864 100644
--- a/dask/tests/test_base.py
+++ b/dask/tests/test_base.py
@@ -460,6 +460,13 @@ def test_tokenize_dense_sparse_array(cls_name):
     assert tokenize(a) != tokenize(b)
 
 
+def test_tokenize_object_with_recursion_error_returns_uuid():
+    cycle = dict(a=None)
+    cycle["a"] = cycle
+
+    assert len(tokenize(cycle)) == 32
+
+
 def test_is_dask_collection():
     class DummyCollection(object):
         def __init__(self, dsk=None):

pip install -e .[complete]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
bokeh==3.4.3
click==8.1.8
cloudpickle==3.1.1
contourpy==1.3.0
-e git+https://github.com/dask/dask.git@55445565c3746f97f2bc50d5628a484576cef90e#egg=dask
distributed==2.30.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
fsspec==2025.3.2
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.1.6
locket==1.0.0
MarkupSafe==3.0.2
msgpack==1.1.0
numpy==2.0.2
packaging @ file:///croot/packaging_1734472117206/work
pandas==2.2.3
partd==1.4.2
pillow==11.1.0
pluggy @ file:///croot/pluggy_1733169602837/work
psutil==7.0.0
pytest @ file:///croot/pytest_1738938843180/work
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.2
six==1.17.0
sortedcontainers==2.4.0
tblib==3.1.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
toolz==1.0.0
tornado==6.4.2
tzdata==2025.2
xyzservices==2025.1.0
zict==3.0.0

name: dask
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - bokeh==3.4.3
      - click==8.1.8
      - cloudpickle==3.1.1
      - contourpy==1.3.0
      - distributed==2.30.1
      - fsspec==2025.3.2
      - jinja2==3.1.6
      - locket==1.0.0
      - markupsafe==3.0.2
      - msgpack==1.1.0
      - numpy==2.0.2
      - pandas==2.2.3
      - partd==1.4.2
      - pillow==11.1.0
      - psutil==7.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.2
      - six==1.17.0
      - sortedcontainers==2.4.0
      - tblib==3.1.0
      - toolz==1.0.0
      - tornado==6.4.2
      - tzdata==2025.2
      - xyzservices==2025.1.0
      - zict==3.0.0
prefix: /opt/conda/envs/dask

dask/tests/test_base.py::test_tokenize_object_with_recursion_error_returns_uuid
dask/tests/test_base.py::test_tokenize_numpy_scalar_string_rep dask/tests/test_base.py::test_tokenize_pandas_extension_array dask/tests/test_base.py::test_optimize_globals dask/tests/test_base.py::test_optimize_None
dask/tests/test_base.py::test_normalize_function dask/tests/test_base.py::test_tokenize dask/tests/test_base.py::test_tokenize_numpy_array_consistent_on_values dask/tests/test_base.py::test_tokenize_numpy_array_supports_uneven_sizes dask/tests/test_base.py::test_tokenize_discontiguous_numpy_array dask/tests/test_base.py::test_tokenize_numpy_datetime dask/tests/test_base.py::test_tokenize_numpy_scalar dask/tests/test_base.py::test_tokenize_numpy_array_on_object_dtype dask/tests/test_base.py::test_tokenize_numpy_memmap_offset dask/tests/test_base.py::test_tokenize_numpy_memmap dask/tests/test_base.py::test_tokenize_numpy_memmap_no_filename dask/tests/test_base.py::test_tokenize_numpy_ufunc_consistent dask/tests/test_base.py::test_tokenize_partial_func_args_kwargs_consistent dask/tests/test_base.py::test_normalize_base dask/tests/test_base.py::test_tokenize_pandas dask/tests/test_base.py::test_tokenize_pandas_invalid_unicode dask/tests/test_base.py::test_tokenize_pandas_mixed_unicode_bytes dask/tests/test_base.py::test_tokenize_pandas_no_pickle dask/tests/test_base.py::test_tokenize_pandas_index dask/tests/test_base.py::test_tokenize_kwargs dask/tests/test_base.py::test_tokenize_same_repr dask/tests/test_base.py::test_tokenize_method dask/tests/test_base.py::test_tokenize_sequences dask/tests/test_base.py::test_tokenize_dict dask/tests/test_base.py::test_tokenize_set dask/tests/test_base.py::test_tokenize_ordered_dict dask/tests/test_base.py::test_tokenize_range dask/tests/test_base.py::test_tokenize_object_array_with_nans dask/tests/test_base.py::test_tokenize_base_types[1] dask/tests/test_base.py::test_tokenize_base_types[True] dask/tests/test_base.py::test_tokenize_base_types[a0] dask/tests/test_base.py::test_tokenize_base_types[a1] dask/tests/test_base.py::test_tokenize_base_types[1.0] dask/tests/test_base.py::test_tokenize_base_types[1j0] dask/tests/test_base.py::test_tokenize_base_types[1j1] dask/tests/test_base.py::test_tokenize_base_types[x7] dask/tests/test_base.py::test_tokenize_base_types[x8] dask/tests/test_base.py::test_tokenize_base_types[x9] dask/tests/test_base.py::test_tokenize_base_types[None] dask/tests/test_base.py::test_tokenize_base_types[str] dask/tests/test_base.py::test_tokenize_base_types[int] dask/tests/test_base.py::test_tokenize_literal dask/tests/test_base.py::test_tokenize_numpy_matrix dask/tests/test_base.py::test_is_dask_collection dask/tests/test_base.py::test_unpack_collections dask/tests/test_base.py::test_custom_collection dask/tests/test_base.py::test_compute_no_opt dask/tests/test_base.py::test_compute_nested dask/tests/test_base.py::test_use_cloudpickle_to_tokenize_functions_in__main__ dask/tests/test_base.py::test_optimizations_keyword dask/tests/test_base.py::test_optimize dask/tests/test_base.py::test_optimize_nested dask/tests/test_base.py::test_default_imports dask/tests/test_base.py::test_persist_literals dask/tests/test_base.py::test_persist_nested dask/tests/test_base.py::test_persist_delayed dask/tests/test_base.py::test_normalize_function_limited_size dask/tests/test_base.py::test_scheduler_keyword dask/tests/test_base.py::test_raise_get_keyword dask/tests/test_base.py::test_get_scheduler dask/tests/test_base.py::test_callable_scheduler dask/tests/test_base.py::test_num_workers_config[threads] dask/tests/test_base.py::test_num_workers_config[processes]
dask/base.py
dask/base.py